我目前正在做一个学校项目,我想将进程的PID存储在全局数组ID中,以便可以在另一个函数中使用它:
int id[3];
int main(int agrc,const char* agrv[]) {
for(int i = 0; i < 3; i++) {
if((fork() == 0)) {
id[i] = (int)getpid();
printf("ID[%d] = %d\n",i,id[i]);
if(i != 3) {
printf("I am a wharehouse. PID = [%d] PPID = [%d]\n",getpid(),getppid());
whcode();
exit(0);
}
else if(i == 3) {
printf("I am the central. PID = [%d] PPID = [%d]\n",getpid(),getppid());
central_code();
exit(0);
}
}
}
sleep(2);
printf("ID[0] = %d\n",id[0]);
printf("ID[1] = %d\n",id[1]);
printf("ID[2] = %d\n",id[2]);
}
但是当我运行此命令时,最后3张打印的输出为0,它应该是每个进程的PID。为什么会这样?
答案 0 :(得分:2)
在调用fork()
时,将创建具有单独虚拟内存空间的新进程。该子进程将从使用0
的派生调用返回,因此在您的代码中,该子进程将进入if分支内,并将其分配给id[i]
是pid。但是,此分配是在具有单独的虚拟内存的单独进程中发生的,因此它对父虚拟内存空间没有影响,并且父父不会看到其数组中的任何更改。这就是为什么您的代码显示零的原因。
如果要通过父级打印子级的pid,请使用fork()的返回值,在父级中,该返回值是子进程的pid。在for内,使用如下代码:
pid_t child_id;
switch (child_id = fork()) {
case -1:
//Fork failed, exit with error or something
break;
case 0:
//Child code
printf("ID[%d] = %d\n",i,id[i]);
if(i != 3) {
printf("I am a wharehouse. PID = [%d] PPID = [%d]\n",getpid(),getppid());
whcode();
exit(0);
}
else if(i == 3) {
printf("I am the central. PID = [%d] PPID = [%d]\n",getpid(),getppid());
central_code();
exit(0);
}
break;
default:
id[i] = child_id;
break;
}
顺便说一句,您应该将id数组声明为pid_t id[3]
,并且在打印时将其打印尽可能长的时间。目前,这可能是处理这些问题的最便捷的方法。