C 访问共享内存中的结构后发生SEGFULT?

C 访问共享内存中的结构后发生SEGFULT?,c,struct,posix,shared-memory,C,Struct,Posix,Shared Memory,我在跨进程共享存储在struct中的值时遇到问题。下面,我的代码简化为一个进程,它将增加值num2。每当进程结束时,waitpid()将进程的pid写入数组。这也被简化了,在我的大项目中,我有大约100个进程,它们依次在数组中编写它们的pids。所以每个进程都可以看到数组。但是,struct中的整数值对于它们中的每一个都是不同的。为什么? #include <stdio.h> #include <stdlib.h> #include <unistd.h> #i

我在跨进程共享存储在
struct
中的值时遇到问题。下面,我的代码简化为一个进程,它将增加值
num2
。每当进程结束时,
waitpid()
将进程的
pid
写入数组。这也被简化了,在我的大项目中,我有大约100个进程,它们依次在数组中编写它们的
pid
s。所以每个进程都可以看到数组。但是,
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);

您应该使用
k
而不是
malloc()
k
的地址在进程之间共享。我认为您误解了shm的api。即,替换
main_data->array=带有
主数据->数组=(void*)k每个进程将获得一份新的
主\u数据副本
。您需要将
shmget
num2*sizeof(char)
一起使用

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


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

为什么要对
main()进行原型设计?也很相似,;唯一的区别是多个指针。
  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;
}