2014-03-03 37 views
2

我最近發現更新我們的服務器上的OSX軟件後,我無法運行我的程序之一,沒有得到分段錯誤11.它是一個簡單的程序,試圖分配共享內存,然後釋放它。當我使用sudo編譯和運行我的文件時,它工作正常。任何幫助將非常感激!OSX和共享內存需要sudo

源代碼:

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/ipc.h> 
#include <sys/types.h> 
#include <stddef.h> 
#include <sys/un.h> 
#include <unistd.h> 

int main(){ 
    double *shared; 
    int arrsize, shmid; 
    arrsize = 10; 
    shmid = shmget(IPC_PRIVATE, arrsize * sizeof(double), IPC_CREAT | 666); 
    shared = (double*) shmat(shmid, NULL, 0); 
    shared[2] = 3.0; //source of Segmentation Fault 
    shmdt((void*) shared); 
    shmctl(shmid, IPC_RMID, NULL); 
    printf("Success!"); 
    return 0; 
} 

系統:

ProductName: Mac OS X 
ProductVersion: 10.9.1 
BuildVersion: 13B42 
+2

您有使用System V共享內存的具體原因嗎?如果您需要功能,並且POSIX共享內存更容易設置,則OS X Mach共享內存功能要強大得多。 –

+0

您需要檢查所有'shm *'調用的返回值。 –

+0

嘿,夥計們,對於遲到的回覆抱歉。 謝爾蓋 - 我從Ubuntu的移植程序。如果這個程序要留在osx上,我一定會看看mach共享內存。 安德魯 - 偉大的一點!我省略了那部分代碼,但我確實這樣做了。 – djzubah

回答

1

shmget呼叫可能因爲你的字面值666被解析爲一個十進制文本作爲一個普通用戶在運行時出現故障。您需要一個領先的0才能將其視爲預期的八進制。

+0

這樣做了!感謝您的幫助安德魯 – djzubah

2

您沒有正確設置共享內存的權限。您必須使用sys/stat.h中的宏來傳遞正確的權限。諮詢man 2 chmod

shmid = shmget(IPC_PRIVATE, arrsize * sizeof(double), S_IRUSR | S_IWUSR); 

會做的伎倆。

+0

感謝您的答覆謝爾蓋,我不知道這是否會解決我的問題,因爲我需要添加更多的宏以允許其他用戶訪問共享內存。我很抱歉在這個問題中沒有提到這一點。 – djzubah