1

我在共享存储在struct跨进程中的值时遇到问题。下面我的代码被简化了,只有一个过程,这将增加 value num2。每当进程结束时,waitpid()pid进程的写入数组。这又被简化了,在我更大的项目中,我有大约 100 个进程,它们依次将它们pid的 s写入array。所以每个进程都会看到数组。但是,对于它们中的每一个,其中的整数值struct都是不同的。为什么?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <semaphore.h>
#include <sys/shm.h>

typedef struct{
   int num;
   int num1;
   int num2;
   char *array;
} data;

void c_print(data *a);

int main(int argc, char *argv[])
{
   data *main_data;

   int pam_id=shmget(IPC_PRIVATE,sizeof(data), IPC_CREAT | IPC_EXCL | 0666);
   if (pam_id == -1)
       fprintf(stderr,"error");
   int k=shmat(pam_id,NULL,0);
   if (k==NULL)
       fprintf(stderr,"shmat error");
   main_data=malloc(sizeof(data));
   main_data->num = strtol(argv[1],NULL,10);
   main_data->num1 = strtol(argv[2],NULL,10);
   main_data->num2 = strtol(argv[3],NULL,10);

没有malloc下文,访问main_data会导致segfault。但是,其他进程看不到存储在struct数组中的变量。

  main_data->array = malloc(main_data->num2*sizeof(char));

  main_data->array[0]=fork();
  if (main_data->array[0]==0){
      main_data->num2+=2;
      exit(9);
  } else {
      waitpid(-1,main_data->array[0],0);
      c_print(main_data);
      return 0;
  }
  return 50;
}
4

1 回答 1

0

你应该使用k而不是malloc(). 的地址k在进程之间共享。我认为您误解了shm api。即,替换main_data->array=...;main_data->array=(void*)k; 每个进程都会得到一个新的main_data. 您需要shmgetnum2*sizeof(char).

您希望共享的内存应该使用shmget()shmat()malloc()将按进程分配,并将使用父内存的副本进行初始化。如果num, num1,num2是私有的 or const,那么您的data结构可以使用malloc()并且数组应该使用shgetand shmat。如果您需要在所有进程中动态更新两者,则两者都必须使用shget()and shmat()

此外,您应该注意数据竞争。

于 2013-04-20T18:06:01.960 回答