2013-03-24 39 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