我是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]
答案 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)
这是程序
并且,关于fork:
修改强>
输出如上所示,因为您的格式说明符是
"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] ...