如何在分叉之间共享数组

How to share an array between forks?

本文关键字:共享 数组 之间 分叉      更新时间:2023-10-16

我正在编写这段代码,它基本上需要一个参数来指定我想要多少个子线程,分叉来获取它们,然后打印存储在数组中的所有 pid。

如果只有父母需要PID,那就好了,但我也需要孩子获得他们的IDS(pcid)。我从网上复制并粘贴了一些代码(我不太明白),所以我不确定为什么它不起作用。

第一次PID打印后出现分割错误。

这是怎么回事?

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main(int argc, char *argv[])
{
if(argc  < 2) {
printf("ERROR: No arguments fed.n");
exit(-1);
}
int amount = atoi(argv[1]);
int i;
int pid = 1;
int pcid = 0;
key_t key;
int shmid;
int *arr[amount];
key = ftok("thread1.c",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
for(i = 0; i < amount; i++) 
{
    if(pid != 0) 
    {
        pid = fork();
    }
    *arr = shmat(shmid, (void *) 0, 0);
    if(pid != 0) 
    {
    *arr[i] = pid;
    }
    else 
    {
    pcid = *arr[i];
    break;
    }
}
if(pid != 0) 
{
    printf("Printing PID Array:n");
    for(i =0; i < amount; i++) 
    {
        printf("%dn", *arr[i]);
    }
}    
else 
{
    printf("My PID: %dn",pcid);
}

}    

您正在使用指针数组。在第 *arr = shmat(shmid, (void *) 0, 0)行中,您将共享内存访问点分配给数组的第一个元素。现在,当您使用*arr[i] = pid时,它将转到未知地址所在的数组i+1元素,并尝试在那里放置一个值。所以你得到了分段错误。