我想创建4个子进程。我必须在某处做错事。我没有解决它。
我的代码如下。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int i;
int pid[4];
pid[0]=fork();
pid[1]=fork();
for(i=0;i<2;i++){
if(pid[i] > 0){
printf("\nI am parent with PID= %d\n",getpid());
printf("My childs PID is %d\n",pid[i]);
}
else if(pid[i] == 0){
sleep(5);
printf("********I'm child with PID=%d\n", getpid());
printf("My parents PID is %d\n", getppid());
}
printf("PID %d terminates!!!\n", getpid());
}
return 0; }
我试图改变很多东西。儿童过程缺失或产生过多。
我在等你的帮助。 输出:
I am parent with PID= 2531
My childs PID is 2532
PID 2531 terminates!!!
I am parent with PID= 2531
My childs PID is 2533
PID 2531 terminates!!!
I am parent with PID= 2533
My childs PID is 2532
PID 2533 terminates!!!
********I'm child with PID=2533
My parents PID is 1
PID 2533 terminates!!!
********I'm child with PID=2534
********I'm child with PID=2532
My parents PID is 2532
PID 2534 terminates!!!
My parents PID is 1
PID 2532 terminates!!!
I am parent with PID= 2532
My childs PID is 2534
PID 2532 terminates!!!
********I'm child with PID=2534
My parents PID is 1
PID 2534 terminates!!!
答案 0 :(得分:0)
您的代码已正确创建4个进程:)错误在for循环中。这是一个基于您的代码的程序,它只是在终端上打印正确的输出,在那里可以看到您正确创建了4个进程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
int i;
int pid[4];
pid[0]=fork();
pid[1]=fork();
if (pid[0] == 0 && pid[1] == 0) {
printf("I'm the child of the child [%d, parent: %d]\n",getpid(),getppid());
} else if (pid[0] == 0 && pid[1] != 0) {
printf("I'm the child [%d, parent: %d]\n",getpid(),getppid());
} else if (pid[0] != 0 && pid[1] == 0) {
printf("I'm the child [%d, parent: %d]\n",getpid(),getppid());
} else if (pid[0] != 0 && pid[1] != 0) {
printf("I'm the father [%d, parent: %d]\n",getpid(),getppid());
wait(&i);
wait(&i);
} else {
printf("some error occurred...\n");
}
return 0;
}
终端上的输出如下:
桌面&gt; PS
USER PID PPID PGID TTY STAT命令 emanueleparisi 1481 1480 1481 ttys000 S-bash
桌面&gt; ./tmp
我是父亲[1745,父母:1481]
我是孩子[1747,父母:1745]
我是孩子[1746,父母:1745]
我是孩子的孩子[1748,父母:1]
希望这对你有用:)
如果你想创建4个子进程(父进程加4个进程,其ppid是父进程),你可以使用这个代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
int i, tmp;
pid_t pid[4];
for (i=0;i<4;i++) {
pid[i] = fork();
if (pid[i] == 0) {
break;
}
}
if (pid[0] != 0 && pid[1] != 0 && pid[2] != 0 && pid[3] != 0) {
// That's the father, it waits for all the childs
printf("I'm the father [pid: %d, ppid: %d]\n",getpid(),getppid());
for(i=0;i<4;i++) {
wait(&tmp);
}
} else {
// That's the child, it print its pid, its parent pid and exits.
printf("I'm one of the children [pid: %d, ppid: %d]\n",getpid(),getppid());
}
return 0;
}
在我的终端上产生以下输出:
桌面&gt; PS
USER PID PPID PGID TTY STAT COMMAND
emanueleparisi 690 688 690 ttys000 S -bash
桌面&gt; ./tmp
我是父亲[pid:877,父母:690]
我是其中一个孩子[879,父母:877]
我是其中一个孩子[880,父母:877]
我是其中一个孩子[878,父母:877]
我是其中一个孩子[881,父母:877]
如您所见,所有子进程都具有相同的父亲;)