Fork相关题目,及其中的知识点

本文通过分析Fork操作的并发问题,探讨了进程执行的随机性和wait/sleep的作用。详细讲解了进程间的执行顺序,以及atexit函数和exit的调用顺序。同时,讨论了进程状态,如僵尸进程和孤儿进程,以及如何处理它们。文章通过实例展示了信号处理,包括SIGINT和SIGCHLD,并解释了信号处理函数如何影响进程的执行流程。
摘要由CSDN通过智能技术生成

如果未说明默认下面的为父进程
1.

void fork0() 
{
   
    if (fork() == 0) {
   
 	printf("Hello from child\n");
    }
    else {
   
 	printf("Hello from parent\n");
    }
}

运行结果如图
在这里插入图片描述
出现这种情况是由于并发引起的,由于系统调用fork后会分为父进程和子进程,其运行的顺序是随机的,如果需要按顺序的话需要用到wait函数或者调用sleep函数等待一段时间(之后不再解释并发),而调用了fork后会分为父进程和子进程,fork返回值如果是0则是子进程,大于0则是父进程,如果小于0则是出错,在上面的程序中,子进程继续往下执行调用printf函数输出:Hello from child,而父进程则是执行else中的调用printf函数输出Hello from parent(之后不再详细解释),执行图如下:
在这里插入图片描述
2.

void fork1()
{
   
    int x = 1;
    pid_t pid = fork();
    if (pid == 0) {
   
 	printf("Child has x = %d\n", ++x);
    } 
    else {
   
 	printf("Parent has x = %d\n", --x);
    }
    printf("Bye from process %d with x = %d\n", getpid(), x);
}

运行结果如下:
在这里插入图片描述
(事实上我运行了很多次,每次都是这种输出结果,照理来说,应当会有不同的输出结果,我百度了一下,出现这种情况似乎是系统调度策略的原因),执行图如下:
在这里插入图片描述

void fork2()
{
   
    printf("L0\n");
    fork();
    printf("L1\n");    
    fork();
    printf("Bye\n");
}

运行的结果如下:
在这里插入图片描述

运行的流程图如下:
在这里插入图片描述

void fork3()
{
   
    printf("L0\n");
    fork();
    printf("L1\n");    
    fork();
    printf("L2\n");    
    fork();
    printf("Bye\n");
}

运行结果如下:
在这里插入图片描述有个地方大家或许会觉得很奇怪,那就是为什么

dogson@ubuntu:~/Desktop/chap8_code/chap8_code

会在中间输出出来呢,(根据本人百度的结果,同时之前也提到,由于操作系统调度算法的原因会导致在某种情况下父进程先于子进程运行,且父进程是在当前shell运行的,父进程运行完了就先返回了,所以就先输出了

dogson@ubuntu:~/Desktop/chap8_code/chap8_code

而此时子进程还在运行,所以就接着输出,就出现了上方出现的结果,接下来我们尝试用sleep让父进程等待再查看结果:
代码如下:

void fork3()
{
   
    pid_t i;
    printf("L0\n");
    i = fork();
    if(i!=0)
       sleep(1);
    printf("L1\n");    
    fork();
    printf("L2\n");    
    fork();
    printf("Bye\n");
}

运行结果如图:
在这里插入图片描述
但是偶尔还是会出现像如下图的情况
在这里插入图片描述
也就是,在shell提示符之后还输出了一次Bye,根据楼主的推测,这是因为输出函数需要一定的时间,因此父进程先返回了,而最后的Bye还没有输出 (仅仅为推测,欢迎指正),所以在shell提示符之后还会再输出一个Bye

之后不再解释shell提示符的问题

正常情况下的执行图如下:

在这里插入图片描述

void fork4()
{
   
    printf("L0\n");
    if (fork() != 0) {
   
	 printf("L1\n");    
         if 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值