【问题标题】:How to share an array between forks?如何在分叉之间共享数组?
【发布时间】:2012-09-17 05:08:09
【问题描述】:

我正在编写这段代码,它基本上接受一个参数来指定我想要多少个子线程,派生来获取它们,然后打印存储在数组中的所有 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("%d\n", *arr[i]);
    }
}    
else 
{
    printf("My PID: %d\n",pcid);
}


}    

【问题讨论】:

  • 任何进程都可以通过getpid()获得自己的ID。这是你需要的吗?如果您希望所有孩子都获得所有其他孩子的 PID,这有点复杂,您需要同步对您似乎没有做的共享内存的访问。
  • 这正是我所需要的。让我试试看。
  • 为什么要使用指针数组?
  • 我认为这会给我数组的指针。不是吗?无论如何,多亏了n.m,我得到了我想要的。可怕的代码是因为我在大学学习这个操作系统课程,我们的整个背景都是 Java 的,甚至这本书也是 Java 的,但是教授用 C/C++ 提供实验室,我们都不熟悉所以我们都在努力完成这项工作。
  • 在 C/C++ 中,在值上下文中使用数组会自动衰减为指向数组第一个元素的指针。所以声明int arr[amount],然后当你引用arr时,它将是一个指针。

标签: c++ c fork shared-memory


【解决方案1】:

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

【讨论】:

  • 使用 (*arr)[i​​] = pid 语句而不是 *arr[i] = pid。如果你想在共享内存段中存储 pid 值。
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2011-09-29
  • 2010-09-18
  • 2020-08-31
相关资源
最近更新 更多