2013-03-14 82 views
1

我一直有一個shmget的問題現在幾個小時,我似乎無法弄清楚。每次我嘗試撥打電話時都會收到一個EINVAL:「無效的參數」錯誤。shmget()給EINVAL錯誤

代碼的重要的部分是如下:

key_t generate_ipc_key() 
{ 
    key_t ipc_key = ftok(__FILE__, KEY); 
    if(ipc_key < 0) { 
     perror("Failed to Generate IPC Key"); 
     exit(IPC_FAILURE); 
    } 

    return ipc_key; 
} 

int shared_memory_create(size_t memory_size) 
{ 
    int shm_key = shmget(generate_ipc_key(), memory_size, IPC_CREAT | 0666); 
    if(shm_key < 0) { 
     perror("Failed to Create Shared Memory Key"); 
     exit(CREATE_FAILURE); 
    } 

    return shm_key; 
} 

該函數被調用:

shm_key = shared_memory_create(sizeof(data_t)); 

凡data_t是一個結構:

typedef struct { 
    int hCount; 
    int oCount; 
    int bCount; 
} data_t; 

同樣在它有助於共享內存的值是:

kernal.shmmax = 33554432 
kernal.shmall = 2097152 
kernal.shmmni = 4096 

我對C相當陌生,所以我確信這是簡單的東西我很想念但是我似乎無法弄清楚。任何幫助表示讚賞!

我不確定它到底是什麼,ipcs顯示沒有共享段,我重新啓動,現在它工作。

+0

這可能有幫助。 EINVAL!=「無效參數」。 EINVAL =將創建一個新段,並且'size SHMMAX',或者不創建新段,具有給定鍵的段存在,但大小大於該段的大小。手冊頁。檢查'memory_size'參數。 – yeyo 2013-03-14 01:07:25

+1

@Kira:我得到了errno 22,這是我的系統上的EINVAL。 – pal25 2013-03-14 01:12:46

回答

1

手冊頁說:

EINVAL A new segment was to be created and size < SHMMIN or 
size > SHMMAX, or no new segment was to be created, a 
segment with given key existed, but size is greater than 
the size of that segment. 

所以,檢查是否有這些應用。 您可以運行ipcs工具列出現有的共享內存段,並查看您的程序是否與其中任何一個衝突。請注意,共享內存段在您的流程結束後仍然存在。

+1

我不相信shmmni是最小尺寸。這是可以創建的共享內存段的最大數量。儘管如此,我同意你的其餘部分,他們可能需要增加大小。問題是這個價值應該是什麼。 – spdaley 2013-03-14 02:04:06

+1

我實際上試了一下,看看這是不是問題,並將其設置爲關閉2097152,仍然沒有骰子。我實際上並不認爲有一個SHMMIN,我試過了,它顯然是1個字節。 – pal25 2013-03-14 03:36:42

+0

@spdaley是的,你是對的,這是常量SHMMIN,而不是kernel.shmmni – nos 2013-03-14 09:23:27