2014-04-25 38 views
2

命令semctl總是返回-1(在控制檯中返回「Fail2」)。我究竟做錯了什麼?C中用於共享內存的信號量無法初始化

union semun{ 
    int val; 
    struct semid_ds *buf; 
    unsigned short int *array; 
    struct seminfo *__buf; 
} forsem; 
forsem.val = 0; 


int sem; 
if((sem= semget(key, 1, 0666 | IPC_CREAT) == -1)) { 
    fprintf(stderr, "Fail1"); 
} 

if (semctl(sem, 0, SETVAL, forsem) == -1) { 
    fprintf(stderr, "Fail2"); 
} 

errno的寫入Invalid argument

+4

當像semctl這樣的系統調用返回-1時, ['errno'](http://man7.org/linux/man-pages/man3/errno.3.html)出了什麼問題。您可以使用['strerror']獲取可打印的字符串(http://man7.org/linux/man-pages/man3/strerror.3.html)。 –

+0

我沒有和errno一起工作太多。我應該寫什麼來獲取錯誤形式'semctl'? E:我明白了。它給出''無效參數'' – SRewip

+1

包含頭文件'errno.h'並檢查變量'errno'以找出錯誤代碼。 更多細節在這裏:http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_2.html 一旦你有了它,請檢查錯誤代碼的含義:http:// man7 .ORG/LINUX /人-頁/男2/semctl.2.html – Sinstein

回答

1

您做一個簡單的錯誤:在

if((sem= semget(key, 1, 0666 | IPC_CREAT) == -1)) { fprintf(stderr, "Fail1"); }

你應該寫

if((sem= semget(key, 1, 0666 | IPC_CREAT)) == -1) { fprintf(stderr, "Fail1"); }

注意括號?

順便說一下,錯誤是EIDRM,因爲sem在您的代碼中爲0,而不是Invalid Argument

0

感謝您的回答!不要緊。它唯一沒有給出錯誤的是semctl與第二個參數0(信號量集中信號量的數量),如果我把1或30放在那裏,它返回-1。