0

我是 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]

4

2 回答 2

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);

回答您的问题:fork1 创建 1 个进程,然后fork2 创建 2 个进程(由父级和子级调用),fork3 创建 4,因此您有 8 个进程。

打印顺序取决于调度程序;运行它几次,顺序会改变(但不是因为sleeps; 抑制它们以查看更多更改,并查看ppid == 1父级何时已终止)。

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

于 2013-03-16T11:24:24.653 回答
0

这里的程序

  • 分叉三次并将各自的结果存储在 f1、f2 和 f3 中。
  • 然后获取当前 pid 和父母的 pid。
  • 全部打印出来。

而且,关于叉子:

  • 如果 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] ...
于 2013-03-16T09:59:48.740 回答