2013-04-20 123 views
1

我在跨进程共享存储在struct中的值时遇到问题。我的代码下面只有一个进程简化,它将增加值num2。每当过程结束时,waitpid()将该过程的pid写入数组。这再次简化了,在我的大项目中,我有大约100个进程,他们先后在阵列中编写了他们的pid。所以每个进程都会看到阵列。但是,对于其中的每一个,struct中的整数值都不相同。为什么?在访问共享内存中的结构后出现Segfault错误?

#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导致段错误。但是,除数组外,其他进程无法查看存储在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; 
} 
+0

你为什么要对'main()'进行原型设计? – 2013-04-20 17:52:14

+0

[这个问题](http://stackoverflow.com/questions/9967388/how-to-modify-shared-memory-shmget-shmat-in-c)也非常相似;唯一的区别是多指针。 – 2013-04-20 18:11:39

回答

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是私人的或const,那么您的data结构可以使用malloc(),并且阵列应该使用shgetshmat。如果您需要在所有进程中动态更新,则两者都必须使用shget()shmat()

此外,你应该照顾数据竞赛。