gpt4 book ai didi

c - 保存 PID 的全局数组。 Fork()、Unix 进程、C 编程

转载 作者:行者123 更新时间:2023-11-30 15:03:13 24 4
gpt4 key购买 nike

我希望在进程之间有一个共享内存来保存 PID。

我创建了 pid_t 类型的全局数组,并使用 fork 创建了新进程,在其中更改了数组元素的值。

如果数组指向同一个,为什么父进程的数组没有改变?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

pid_t p[1];

int main ()
{
pid_t f;

f = fork();
if(f == 0)
{
p[0] = getpid();
printf("Child ... p[0] PID = %d\n", (int)p[0]);
printf("points at %ld\n", (long int)p);
}
else if (f > 0)
{
sleep(1);
printf("Parent... p[0] PID = %d\n", (int)p[0]);
printf("points at %ld\n", (long int)p);
}
else
{
printf("Fork() error \n");
exit(1);
}

}

最佳答案

由 fork() 创建的进程不共享内存。创建的新进程获取父进程中内容的副本,而不是对现有数据的引用。事实上,子进程运行在与父进程完全不同的地址空间中。因此,您的 p[] 数组在子级中是不同的数组,因此修改它不会在父级中更改它。

如果您想在使用 fork() 创建的进程之间共享内存,您可以使用 pipeline() 来单向发送数据,使用 mmap() 来映射共享内存区域,或者使用您的系统中可用的另一种 IPC 机制。操作系统。一般来说,如果您确实需要共享内存,最好使用线程而不是进程。

顺便说一句:使用 sleep() 并不总是可靠地确保事件(在本例中为修改 p[])发生。您可能想在父级中使用 wait() 系列函数之一,这将导致父级阻塞,直到子级退出。

关于c - 保存 PID 的全局数组。 Fork()、Unix 进程、C 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40819348/

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