通过一个简单的例子了解C的fork()

通过一个简单的例子了解C的fork(),第1张

概述#include <stdio.h>int num = 0;int main(int argc, char*argv[]){ int pid; pid = fork(); printf("%d", num); if(pid == 0){ /*child*/ num = 1; }else if(pid > 0){ /*pa
#include <stdio.h>int num = 0;int main(int argc,char*argv[]){    int pID;    pID = fork();    printf("%d",num);      if(pID == 0){       /*child*/        num = 1;    }else if(pID > 0){  /*parent*/        num = 2;    }    printf("%d",num);}

我很难理解为什么可能的产出是
0102或0012或0201或0021.

这是我(认为)它应该是生产.它打到第一个printf语句,无论首先执行哪个子进程或者父进程,num都没有被修改,所以0是第一个.那么下一个是1或2,那么下一个进程执行,所以从0开始(从父文件复制),然后再次是1或2.所以可能的输出应该是:

0101或
0102或
0201或
0202

解决方法 在父级和子级中,对于第一个printf,num为0.在父母和孩子中,打印0,然后打印另一个值.在父进程中,另一个值为2.在子进程中,另一个值为1.

然而,重要的是要注意的是,尽管每个进程都有一个强制的命令,在另一个号码之前必须打印零,但是对于这两个进程相对于彼此的打印没有任何限制.

这是一个现实生活的比喻:假设我的同事和我每个人同时离开工作,停在杂货店,然后到家.我知道我在我家之前在商店,我们知道他在家里在杂货店.但是我们不知道谁先是在杂货店,还是谁先在家.我们可以在同一时间到达杂货店,然后每个人都在同一时间到达家中,或者也许他被推迟了,我甚至到了杂货店和家中,甚至到达商店.

不会发生的事情是不止一次打印1或2.虽然在fork返回后,我们有两个进程在概念上一次运行,而且事件相对于彼此的时间是未指定的,每个进程中的事件顺序都被很好地定义.每个进程将在重新打印之前将num设置为1或2,并且因为fork被定义为在子进程中返回0,而在父项中返回小孩的pID,它们将各自设置为不同的值.

实际上还有一个合理的输出:00.如果fork无法创建一个新进程,则返回-1.在这种情况下,程序将打印0,if和else ifs将失败,因为-1不是0也不大于0,num不改变,程序再次打印0.

如果您想了解C程序中效果排序的定义,则要搜索的关键词是“序列点”.在这个程序中,这是非常简单的(除了我们有两个副本一次运行的事实),但有时可能不那么明显.

总结

以上是内存溢出为你收集整理的通过一个简单的例子了解C的fork()全部内容,希望文章能够帮你解决通过一个简单的例子了解C的fork()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存