这是我的代码并执行此程序我运行./2c 10 5
-
参数1为10,参数2为5。该程序将运行10个子进程,第5个子进程将生成另一个子进程,但在这种情况下,我的ppid始终是相同的。它永远不会改变。所以对于每个孩子,我都有相同的ppid,
我得到的输出是:
pid: 1 ppid: 6 pid: 2 ppid: 6 pid: 3 ppid: 6 pid: 4 ppid: 6 pid: 5 ppid: 6`` pid: 6 ppid: 6 pid: 7 ppid: 6 pid: 8 ppid: 6 pid: 9 ppid: 6 pid: 10 ppid: 6
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[],char *envp[])
{
int i,a;
a=getpid();
int pid;
int child,child2;
child=atoi(argv[1]);
child2=atoi(argv[2]);
if(atoi(argv[2])>atoi(argv[1]))
{
printf("arg2 is bigger than arg1!");
exit(1);
}
for(i=1;i<=child;i++)
{
pid=fork();
if(i=child2 && pid==0)
{
pid=fork();
break;
}
if(pid==0)
break;
}
if(getpid()!=a)
if(getppid()==a)
{
printf("PID: %d PPID: %d\n",getpid(),getppid());
sleep(5);
exit(0);
}
for(i=1;i<=child+1;i++)
wait(0);
return 0;
}
这是我的代码可以有人测试这个并在这个网站上发送输出...所以我可以比较..编译我使用gcc test.c -o test并运行./test 10 5 ... < / p>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[], char *envp[])
{
int i,a;
a=getpid();
pid_t pid;
int child,child2;
child=atoi(argv[1]);
child2=atoi(argv[2]);
if(atoi(argv[2])>atoi(argv[1]))
{
printf("2nd argumentet is bigger than 1st");
exit(1);
}
for(i=1;i<=child;i++)
{
pid=fork();
if(i==child2 && pid==0)
{
pid=fork();
break;
}
if(pid==0)
break;
}
if(getpid()!=child2)
{
printf("PID: %d PPID: %d\n",getpid(),getppid());
sleep(5);
exit(0);
}
for(i=0;i<=child+1;i++)
wait(0);
return 0;
}
答案 0 :(得分:2)
您的代码未能证明您声称正在发生的事情。您仅打印来自孩子的输出,而不是孙子,因为您专门检查了这一行的孩子:
if(getppid()==a)
在该行中,a
保存程序原始实例的pid。这不会改变,因为当您致电fork
时,您已经通过了分配a
的行。所有直系孩子的父母pid总是一样的,因为这就是父母的含义。
删除我上面突出显示的行,您应该会看到您期望的结果。