gpt4 book ai didi

C : Store PID in global variable

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:55 24 4
gpt4 key购买 nike

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

最佳答案

在调用 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],打印的时候打印成long。目前,这可能是处理这些事情的最便携方式。

关于C : Store PID in global variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com