头歌(Linux之进程管理一):第2关:进程创建操作-fork

这篇具有很好参考价值的文章主要介绍了头歌(Linux之进程管理一):第2关:进程创建操作-fork。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务描述

在上一关我们学习如何获取进程的pid信息,本关我们将介绍如何编程创建一个新的进程。

本关任务:学会使用C语言在Linux系统中使用fork系统调用创建一个新的进程。

相关知识

Linux系统中创建进程有很多函数可以使用,其中包括了系统调用也包括库函数。本关将介绍一个最常见的系统调用函数来创建进程,这就是使用fork函数来创建一个新进程。

当用户调用fork函数时,系统将会创建一个与当前进程相同的新进程。通常将原始进程称为父进程,而把新生成的进程称为子进程。子进程是父进程的一个拷贝,子进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。

在早期的系统中,创建进程比较简单。当调用fork时,内核会把所有的内部数据结构复制一份,复制进程的页表项,然后把父进程的地址空间中的内容也复制到子进程的地址空间中。但是从内核角度来说,这种复制方式是非常耗时的。

因此,在现代的系统中采取了更多的优化。现代的Linux系统采用了写时复制技术(Copy on Write),而不是一创建子进程就将所有的数据都复制一份。

Copy on Write(COW)的主要思路是:如果子进程/父进程只是读取数据,而不是对数据进行修改,那么复制所有的数据是不必要的。因此,子进程/父进程只要保存一个指向该数据的指针就可以了。当子进程/父进程要去修改数据时,那么再复制该部分数据即可。这样也不会影响到子父进程的执行。因此,在执行fork时,子进程首先只复制一个页表项,当子进程/父进程有写操作时,才会对所有的数据块进行复制操作。

头歌(Linux之进程管理一):第2关:进程创建操作-fork

[COW思路]

Linux系统中可以使用man命令来查询该函数的使用方法。具体的查询命令为: man 2 函数名

使用fork函数创建进程

fork函数的具体的说明如下:

  • 需要的头文件如下:

    1. #include <unistd.h>
  • 函数格式如下: pid_t fork(void);

  • 函数返回值说明: 调用成功,fork函数两个值,分别是0和子进程ID号。当调用失败时,返回-1,并设置错误编号errno

注意:fork函数调用将执行两次返回,它将从父进程和子进程中分别返回。从父进程返回时的返回值为子进程的 PID,,而从子进程返回时的返回值为0,并且返回都将执行fork之后的语句。

案例演示1: 编写一个程序,使用fork函数创建一个新进程,并在子进程中打印出其进程ID和父进程ID,在父进程中返回进程ID。详细代码如下所示:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. int main()
  7. {
  8. pid_t pid;
  9. pid = fork();
  10. if(pid == -1)
  11. {
  12. //创建进程失败
  13. printf("创建进程失败(%s)!\n", strerror(errno));
  14. return -1;
  15. }
  16. else if(pid == 0)
  17. {
  18. //子进程
  19. printf("当前进程为子进程:pid(%d),ppid(%d)\n", getpid(), getppid());
  20. }
  21. else
  22. {
  23. //父进程
  24. printf("当前进程为父进程:pid(%d),ppid(%d)\n", getpid(), getppid());
  25. }
  26. //子进程和父进程分别会执行的内容
  27. return 0;
  28. }

头歌(Linux之进程管理一):第2关:进程创建操作-fork

将以上代码保存为forkProcess.c文件,编译执行。可以看到每次执行forkProcess时,子进程和父进程都不是固定的执行顺序,因此由fork函数创建的子进程执行顺序是由操作系统调度器来选择执行的。因此,子进程和父进行在执行的时候顺序不固定。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全createProcess函数,使用fork函数创建进程,并在子进程中输出"Children"字符串,在父进程中输出"Parent"字符串。(注意:不要在createProcess函数中使用exit函数或者return来退出程序)。

测试说明

本关的测试需要用户在右侧代码页中补全代码,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/************************
 * 提示: 不要在子进程或父进程中使用exit函数或者return来退出程序
*************************/
void createProcess()
{
	/********** BEGIN **********/
	pid_t pid=fork();

    if(pid==-1)
    {
        printf("创建进程失败(%s)!\n", strerror(errno));
    }
	else if(!pid)
    {
        printf("Children",getpid(),getppid());
    }
    else
    {
        printf("Parent",getpid(),getppid());
    }
	/********** END **********/
}

 第三关链接--头歌(Linux之进程管理一):第3关:进程创建操作-vfork_小妞无语的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-464168.html

到了这里,关于头歌(Linux之进程管理一):第2关:进程创建操作-fork的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux:创建进程 -- fork,到底是什么?

     相信大家在初学进程时,对fork函数创建进程一定会有很多的困惑,比如: 1.fork做了什么事情??  2.为什么fork函数会有两个返回值? 3.为什么fork的两个返回值,会给父进程谅回子进程pid,给子进程返回0? 4.fork之后:父子进程谁先运行?? 5.如何理解同一个变量,会有不同的值?? 本

    2024年02月05日
    浏览(36)
  • 【Linux操作系统】探秘Linux奥秘:进程与任务管理的解密与实战

    🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《操作系统实验室》 🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS 🪐2 进程与任务管理的解密与实战 🌍1. 实验目的 🌍2. 实验准备 🌍3. 实验内容 🌍4. 实验心得 📝

    2024年02月03日
    浏览(49)
  • 头歌操作系统 课堂练习3.2:进程的创建

    本实训需要设置内核版本 1 为调试分析的对象,用 gdb 调试内核,内核版本 1 的压缩文件存放在 /data/workspace/myshixun/exp1 中。 环境配置详情请移步前几关~头歌操作系统 课后作业3.1:进程的描述与状态 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第

    2024年02月04日
    浏览(53)
  • 头歌操作系统-课堂练习3.2:进程的创建

    第1关:进程创建前后TR寄存器值的分析 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第一关.txt 中) 0 号进程的 fork 系统调用(main.c:147)中的陷入指令的地址是多少? 0 号进程执行 fork 系统调用之前,TR 寄存器的值为多少? 0 号进程刚执行完 for

    2023年04月26日
    浏览(48)
  • 【Linux操作系统】深入探索Linux进程:创建、共享与管理

    进程的创建是Linux系统编程中的重要概念之一。在本节中,我们将介绍进程的创建、获取进程ID和父进程ID、进程共享、exec函数族、wait和waitpid等相关内容。 在Linux系统中,进程的创建使用 fork() 系统调用。 fork() 系统调用会创建一个与当前进程相同的子进程,子进程会复制父进

    2024年02月12日
    浏览(54)
  • 头歌(Linux之进程管理一):第4关:进程终止

    任务描述 在上一关我们学习使用 vfork 函数创建新进程,并且使用 exit 来结束子进程,本关我们将介绍 Linux 系统中结束进程的其它方法。 本关任务:学习终止进程的常见方法。 相关知识 在上一关以及看到,开发人员使用 vfork 创建出来的子进程可以用 exit 函数来结束。在 L

    2024年02月08日
    浏览(62)
  • 《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(34)
  • 使用fork函数创建一个进程

    pid_t fork(void) fork函数调用成功,返回两次 (1)返回值为0,代表当前进程是子进程 (2)返回值为非负数,代表当前进程是父进程 (3)调用失败,则返回-1 代码如下:

    2024年02月04日
    浏览(50)
  • Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,上一篇文章我们了解了关于进程的基本概念,今

    2024年02月08日
    浏览(34)
  • Linux 进程和计划任务管理

    保存在硬盘、光盘等介质中的可执行代码和数据· 文件中静态保存的代码 在CPU及内存中运行的程序代码 动态执行的代码 父、子进程         每个程序可以创建一个或多个进程 load average: 0.00, 0.01, 0.05      系统平均负载  1分钟 5分钟 15分钟 查看 load average 的命令有:top  w

    2024年04月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包