C:将PID存储在全局变量中

时间:2018-11-11 00:27:16

标签: c process operating-system global-variables fork

我目前正在做一个学校项目,我想将进程的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。为什么会这样?

1 个答案:

答案 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],并且在打印时将其打印尽可能长的时间。目前,这可能是处理这些问题的最便捷的方法。