关于fork()的一个问题
linux吧
全部回复
仅看楼主
level 4
今天遇到一个fork()的实验,内容如图,但是我为啥每次输出都是cba,不应该输出顺序不确定吗,而且后面那个输出较长字符串的意义是什么,求解答
2021年04月25日 14点04分 1
level 4
dd
2021年04月26日 06点04分 2
level 1
按照POSIX的语义父子进程谁先返回确实不一定,并且你这不应该是acb吗?父进程先返回到shell,所以a字符出现在shell提示符前。
Linux自身有很多“自作聪明”的决定,fork的返回顺序不太清除,可能也是其中之一吧。很多东西都没按照POSIX语义来,同样代码在BSD上应该顺序就不一定了。
这道题主要考你会不会用wait函数
2021年04月27日 06点04分 3
噢对,是acb,看错了抱歉
2021年04月27日 08点04分
我后来又试了好久,发现基本都是acb,很少可能是abc
2021年04月27日 08点04分
所以说就是linux的问题吗,我用的是virtualbox+ubuntu
2021年04月27日 09点04分
@贴吧用户_0GyKUSt 后续讲到,管道和sysvipc这些就不是问题了
2021年04月27日 09点04分
level 1
2021年04月27日 06点04分 4
第一个是BSD的结果,顺序是随机,如你所愿。 第二个是长字符串,父进程虽然先返回,但字符串太长的话,可能还没来得及完成对终端的write,就直接被子进程抢占了,也有可能父进程只完成了部分的write就被子进程抢占了,还是同步问题
2021年04月27日 06点04分
好像linux里面大概率都是父进程先执行,我后来把父进程改成for循环输出1000个字符串,子进程都输出一个字符串,发现子进程的输出位置每次几乎都不一样了,基本都在1000个字符串的中后段中间执行
2021年04月27日 09点04分
@贴吧用户_0GyKUSt 嗯,Linux内核可能自作主张的让父进程先返回了,所以父进程返回后的代码只要不是太耗时总能先执行完。但如果父进程返回后的代码比较耗时,那么父进程,子进程1,子进程2就正常被调度器当作一般进程来调度了,时间片走完就进程切换,没啥好说的了。。
2021年04月27日 09点04分
@TaiBu_龜甲艦 老哥能不能再帮我看一个问题,我发在楼下
2021年05月11日 06点05分
level 4
对这个程序,我把一条sleep语句框了起来,下面两个结果图,一个是有sleep语句的,一个是没有sleep语句的。为什么我把那个sleep语句删掉,只会输出Parent process is killed呢?
2021年05月11日 06点05分 5
level 4
是不是说,如果不sleep,子进程可能没有执行到signal()语句,父进程就将信号发送,所以子进程采用默认处理方式,就是直接终止进程?
2021年05月11日 06点05分 6
level 1
才看到,懒得写代码认证了,信号SIGUSR1/SIGUSR2在设置处置之前default处理是关闭进程,不sleep的话,可能signal没执行,子进程就收到了,父进程的信号,然后被关闭,因此父进程的两个wait顺利返回,子进程无任何输出。 解决方案:将signal调用提前到所有fork调用之前,因为fork会拷贝父进程地址空间,而作为父进程地址空间一部分的信函处置函数也会被进程,你可以试一下
2021年05月13日 08点05分 7
被子进程拷贝
2021年05月13日 08点05分
谢谢老哥🙏
2021年05月15日 02点05分
1