fork函数结果分析

fork()函数结果分析

计算机系统基础-fork()
fork函数
运行结果
结果分析

以进程图为主,对结果进行分析。

fork0
在这里插入图片描述
调用fork(),创建子进程,fork() == 0时,即fork()返回值为0,子进程输出Hello from child;
fork()返回值不为0,父进程输出Hello from parent。
父子进程并发执行,输出的顺序不固定,输出序列对应进程图的拓扑顺序。

fork1

在这里插入图片描述

x=1,调用fork(),创建子进程,
fork() == 0时,即fork()返回值为0,子进程获得父进程代码、数据段、堆、栈等资源的副本。x++,故x = 2,输出pid和x;
fork()返回值不为0,父进程中,子进程对x的运算是独立的,x–,故x=0。

fork2
在这里插入图片描述

fork3
在这里插入图片描述
fork4
在这里插入图片描述
fork5
进程图与fork4类似

fork6
在这里插入图片描述
atexit()在函数终止时被调用,故在fork()后执行,父进程和子进程都会输出Cleaning up语句

fork7
在这里插入图片描述
子进程输出语句结束,父进程输出语句后一直进行while循环。Shell命令不会执行,需要手动挂起或中断父进程。

$ ./fork 7

在这里插入图片描述

用ps命令查看系统中执行的程序
在这里插入图片描述

可以看到子进程的状态码为Z,处于僵死状态,因为父进程一直没有回收它,它将一直占用内存。
尝试用kill命令杀死僵死的子进程
在这里插入图片描述
可以看到,kill子进程无效。为什么?
僵尸进程要等到父进程结束,或者重启系统才可以被释放。fork 7 中父进程被挂起(CTRL+Z),处于停止状态,但一直没有结束。该子进程是僵尸进程,此时进程已经释放所有的资源,但是没有被父进程释放,因此kill子进程无效。

发送信号9(SIGKILL)给父进程,将挂起的父进程杀死

$ kill -9 23541

在这里插入图片描述
可以看到,父进程被杀死后,子进程也被杀死了。

fork8
在这里插入图片描述
子进程输出语句后一直进行while循环,父进程输出语句后结束。与fork7不同的是,虽然子进程一直在执行,但Shell命令会在父进程结束后执行。
在这里插入图片描述
可以看到子进程一直处于运行状态。

fork9
在这里插入图片描述
wait(&child_status)父进程需等待子进程结束后才继续能执行,CT语句一定在最后输出。

fork10
exit(100+i);子进程的退出码分别为100、101、102、104、105,waitpid(pid[i], &child_status, 0);获取子进程结束的状态值,某一子进程结束后输出其PID和退出码。
(fork11与其类似)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:在Linux中,fork函数用于创建一个新的进程。它会复制父进程的数据空间、堆和栈,并将其作为子进程的副本。fork函数的返回值在子进程中为0,在父进程中为子进程的ID,出错时返回-1。 关于文件描述符的问题,文件描述符是对打开文件的引用。在fork函数调用之后,子进程会继承父进程的文件描述符。这意味着子进程可以访问到与父进程相同的打开文件。子进程会拥有父进程打开文件的副本,但是它们是独立的。也就是说,如果父进程或子进程修改了文件描述符,不会影响到对方的文件描述符。这样做可以实现进程间的独立性和隔离性。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Linux学习?fork用法](https://download.csdn.net/download/weixin_38630697/14070621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [分析fork后多进程对文件的共享](https://blog.csdn.net/weixin_34087307/article/details/94683295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值