fork() 和原始父进程的子进程
fork() and children of original parent process
我编写了一个使用 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 应该都一样,还是我的代码有问题?
不要与 fork()
的 return 值混淆:
#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
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
headers 的顺序不正确。 sys/ headers 不仅应该始终排在第一位,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 是 child 的 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);
这一行是由你原来的进程执行的。也许您想在 child 中执行它。但是 child 刚刚退出。
}
return 0;
}
Thislink给你解释一下。
在你写这行的情况下
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
此行由 parent 进程而非 child 进程处理。
变量"n"存储了fork创建后的return值(创建成功时为0)。因此,为了获得 child 的进程 ID,您必须在
中输出您的代码
else if (n == 0) { //child process
exit(i);
}
希望对您有所帮助。
我编写了一个使用 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 应该都一样,还是我的代码有问题?
不要与 fork()
的 return 值混淆:
#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
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
headers 的顺序不正确。 sys/ headers 不仅应该始终排在第一位,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 是 child 的 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);
这一行是由你原来的进程执行的。也许您想在 child 中执行它。但是 child 刚刚退出。 }
return 0;
}
Thislink给你解释一下。
在你写这行的情况下
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
此行由 parent 进程而非 child 进程处理。 变量"n"存储了fork创建后的return值(创建成功时为0)。因此,为了获得 child 的进程 ID,您必须在
中输出您的代码else if (n == 0) { //child process
exit(i);
}
希望对您有所帮助。