跟随Fork的逻辑

时间:2013-03-16 09:55:02

标签: c fork

我是C的新手,我找到了这段代码:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DISPLAY \
"mypid[%3.3d] - ppid[%3.3d] - f1[%3.3d] - f2[%3.3d] -  f3[%3.3d]\n"
main(void) {
   int f1, f2, f3, mypid, ppid;
   f1 = (int) fork();
   sleep(1);
   f2 = (int) fork();
   sleep(2);
   f3 = (int) fork();
   sleep(3);
   mypid=(int) getpid();
   ppid=(int) getppid();
   printf(DISPLAY, mypid, ppid, f1, f2, f3);
   waitpid(-1,NULL,0);
   waitpid(-1,NULL,0);
   waitpid(-1,NULL,0);
   exit (0);
}

任何人都可以帮助我,这段代码背后的逻辑究竟是什么?我试图运行它好几次,但我仍然不知道。

此代码的结果:

  

mypid [9341] - ppid [9339] - f1 [000] - f2 [9342] - f3 [9344]

     

mypid [9346] - ppid [9342] -f1 [000] -f2 [000] -f3 [000]

     

mypid [9339] - ppid [9220] - f1 [9341] - f2 [9343] - f3 [9345]

     

mypid [9342] - ppid [9341] - f1 [000] - f2 [000] - f3 [9346]

     

mypid [9344] - ppid [9341] - f1 [000] - f2 [9342] - f3 [000]

     

mypid [9343] - ppid [9339] - f1 [9341] - f2 [000] - f3 [9347]

     

mypid [9347] - ppid [9343] - f1 [9341] - f2 [000] - f3 [000]

     

mypid [9345] - ppid [9339] - f1 [9341] - f2 [9343] - f3 [000]

2 个答案:

答案 0 :(得分:1)

由于(int)pid_t兼容,int演员阵容无用;将pid存储为int的主要优点是,您可以在不进行强制转换的情况下打印它们。

您的代码显示fork();的使用非常糟糕,从不使用它!

正确使用是:

f1 = fork();
if (f1 < 0) { perror ("fork"); exit (1); }

if (f1 == 0) {  
    /* here code of child 1 */
    exit (0);
}

f2 = fork();
if (f2 < 0) { perror ("fork"); exit (1); }

if (f2 == 0) {  
    /* here code of child 2 */
    exit (0);
}

/* same for child 3 */

/* Now wait for each child */
wait (NULL);
wait (NULL);
wait (NULL);

要回答您的问题:fork 1创建1个流程,然后fork 2创建2个流程 (它由父母和孩子调用)并且fork 3创建4,所以你有8个进程。

打印顺序取决于调度程序;多次运行并且订单会发生变化(但不会因为sleep而改变;请禁止它们查看更多更改,并在父项已被终止时查看ppid == 1

wait错误放置,因为孩子们不必(这里他们会失败)。 waitpid(-1,NULL,0)相当于wait(NULL)

答案 1 :(得分:0)

这是程序

  • 分叉三次&amp;将相应的结果存储在f1,f2和amp; F3。
  • 然后得到当前的pid&amp;父母的pid。
  • 打印所有内容。

并且,关于fork:

  • 如果fork()返回负值,则子进程的创建不成功。
  • 如果fork()向新创建的子进程返回零。
  • 如果fork()返回一个正值,则子进程的进程ID为父进程。

修改

输出如上所示,因为您的格式说明符是

"mypid[%3.3d] - ppid[%3.3d] - f1[%3.3d] - f2[%3.3d] -  f3[%3.3d]\n"

解释为:

mypid[<first argument>] - ppid[<second argument>] ...

导致

mypid[9341] - ppid[9339] ...