fork() 和原始父进程的子进程
Posted
技术标签:
【中文标题】fork() 和原始父进程的子进程【英文标题】:fork() and children of original parent process 【发布时间】:2016-03-04 06:27:33 【问题描述】:我编写了一个使用 fork() 创建多个进程的程序。现在我正在努力做到每次调用 fork() 时,只有原始父进程产生子进程。例如,如果我给出 4 的参数,我应该让所有 4 个 ppid 及其子级都相同。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc, char **argv)
int i;
int n;
int num_kids;
if(argc != 2)
fprintf(stderr, "Usage: forkloop <numkids>\n");
exit(1);
num_kids = atoi(argv[1]);
for(i = 0; i < num_kids; i++)
n = fork();
if(n < 0)
perror("fork");
exit(1);
else if (n == 0)
exit(i);
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
return 0;
当我运行它时,每个 ppid 都是相同的,但每个子 pid 也是相同的。如果我给出 4 作为我的论点,我会得到:
pid = 19765, ppid = 18449, i = 0
pid = 19765, ppid = 18449, i = 1
pid = 19765, ppid = 18449, i = 2
pid = 19765, ppid = 18449, i = 3
孩子的pid应该都一样,还是我的代码有问题?
【问题讨论】:
子进程马上退出,做这些打印输出的进程是父进程(每次都是同一个进程)。 请不要破坏您的问题。 【参考方案1】:不要与fork()
的返回值混淆:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc, char **argv)
int i;
int n;
int num_kids;
if(argc != 2)
fprintf(stderr, "Usage: forkloop <numkids>\n");
exit(1);
num_kids = atoi(argv[1]);
printf("parent pid = %d\n", getpid());
for(i = 0; i < num_kids; i++)
n = fork();
if(n < 0)
perror("fork");
exit(1);
else if (n == 0) // child process
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
exit(i);
return 0;
输出:
parent pid = 54981
pid = 54982, ppid = 54981, i = 0
pid = 54983, ppid = 54981, i = 1
pid = 54984, ppid = 54981, i = 2
pid = 54985, ppid = 54981, i = 3
【讨论】:
【参考方案2】:This 链接为您解释事情。
在你写这行的时候
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
这一行是由父进程而不是子进程处理的。 变量“n”存储fork创建后的返回值(创建成功时为0)。所以为了得到孩子的进程ID,你必须把你的代码拿出来
else if (n == 0) //child process
exit(i);
希望对您有所帮助。
【讨论】:
【参考方案3】:#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
标题顺序不正确。 sys/ 标头不仅应该始终放在第一位,getpid 和 getppid 的手册页还专门将 sys/types.h 放在 unistd.h 之上。
int main(int argc, char **argv)
int i;
int n;
int num_kids;
if(argc != 2)
fprintf(stderr, "Usage: forkloop <numkids>\n");
exit(1);
num_kids = atoi(argv[1]);
for(i = 0; i < num_kids; i++)
n = fork();
n 对孩子的 pid 来说是个坏名字。
if(n < 0)
perror("fork");
exit(1);
else if (n == 0)
exit(i);
不正确。应该是_Exit。
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
此行由您的原始进程执行。也许你想在孩子身上执行它。但孩子只是退出了。
return 0;
【讨论】:
以上是关于fork() 和原始父进程的子进程的主要内容,如果未能解决你的问题,请参考以下文章
fork 和 signal:如何将信号从父进程发送到特定的子进程