C ++ fork(),多线程和OS的概念

时间:2016-09-15 16:33:02

标签: c++ multithreading operating-system fork

今天,我用C ++编写了一个小程序:

pid_t pChild=0;
printf("Main process ID:%d\n",getpid());
pChild= fork();
printf("%d\n",pChild);
if (pChild!=0){ 
  printf("Parent process ID:%d\n",getpid());
  printf("Child process ID:%d\n",pChild);
}
else printf("Sorry! The child can not be created\n");

return 0;

输出就像这样

  

主要流程ID:3140

     

抱歉!无法创建孩子

     

父进程ID:3140

     

子进程ID:3141

然后,我想知道输出。

我猜测子进程的第一个getpid()没有运行,因为它从其父进程中使用getpid()读取相同的数据;这个消息

  

抱歉!无法创建孩子

必须来自子进程的if语句。如果我错了,请纠正我......

但是我仍然无法理解为什么孩子的fork()函数没有运行。为什么被阻止?是因为它们读取了相同的pChild数据(子进程中的fork()之一,另一个是主进程的if语句)?

任何人都可以解释一下它的更多细节吗?谢谢。

1 个答案:

答案 0 :(得分:5)

来自fork() documentation

  

返回值

     

成功完成后,fork()将0返回子进程   并应将子进程的进程ID返回给父进程。

您的代码假定任何返回值都是错误。

继续:

  

两个进程都将继续从fork()函数执行。   否则,-1将返回到父进程,没有子进程   应创建进程,并设置errno以指示   错误。

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <button id="display-img" class="btn btn-primary"><span><i class="glyphicon glyphicon-menu-right"></i></span>Kid who did not get rounded</button> <div class="ajax_accordion_content" style="display: none;"> <div class="report-detail"> <table border="0" cellpadding="0" cellspacing="0" width="100%" class="table_basic"> <tbody> <!-- ThingLink image to be embedded --> <img style="max-width: 100%;" src="http://cdn.thinglink.me/api/image/832705713204625409/1024/10/scaletowidth#tl-832705713204625409;1043138249'" class="alwaysThinglink" /> <script async charset="utf-8" src="http://cdn.thinglink.me/jse/embed.js"></script> </tbody> </table> </div> </div>返回值是错误指示。