2013-03-24 72 views
2

我提前为我的无知道歉,这是给我比它应该有更多的麻烦,但我一直在敲打我的头到我的办公桌上了几个小时试图想出什么我做错了。我想写一个共享内存存储结构的应用程序。出于某种原因,我不能离开地面开始,我一直访问我的结构的成员得到一个赛格故障。赛格故障在共享使用结构内存

#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 

#define MAX_SEQUENCE 10 

struct shared_data 
{ 
    long sequence[10]; 
    int sequence_size; 
}; 
typedef struct shared_data shared_data; 

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

    shared_data * shared_memory; 

    segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR | S_IWUSR); 

    shared_memory = (shared_data *) shmat(segment_id, NULL, 0); 

    shared_memory->sequence_size = atoi(argv[1]); 

    printf("\n\nSequence Size: %d\n\n",shared_memory->sequence_size); 

    shmdt(shared_memory); 
} 

更新:谢谢大家,我的系统管理员正在运行诊断程序并以某种方式禁用了共享内存。

+0

我只是想你发布的代码,并编译和运行良好 – lxop 2013-03-24 22:24:19

回答

3

您的代码不看对我不好。唯一缺少的明显的事情是对的方式通参数的个数某种检查:

if (argc != 2) 
    return 1; 

难道你只是错过了一个参数来调用程序。在这种情况下,它将是

atoi (argv[1]) 

导致您的段错误。

顺便说一句:另外检查返回值shmgetshmat也可能是一个好主意。

+0

啊,好点的,当我跑我只是传递参数的代码,假设OP在做这一点。 – lxop 2013-03-24 22:27:44

+0

虽然我错过了我的第一次尝试:)作为OP可能丢失了。 – mikyra 2013-03-24 22:30:29

+0

并牢记的atoi()已过时。看看strtol()来代替。 – 2013-03-24 23:14:08