2012-09-10 31 views
0

我試圖讓這段代碼工作,但我不能。我設法創造一些代碼,不顯示任何編譯錯誤或警告,但是當我嘗試執行它失敗,此錯誤:semget沒有這樣的文件或目錄

了semget:沒有這樣的文件或目錄

這是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/sem.h> 
#include <time.h> 

int main(int argc, char *argv[]) { 
    key_t llave1,llavesem; 
    int idmem,idsem; 
    struct sembuf op;  
    llavesem=ftok("/tmp",'b'); 

    idsem=semget(llavesem,1,0); /* This is the line giving the error*/ 
    if (idsem==-1) { 
     perror ("semget"); 
     return 1; 
    } 

    semctl(idsem,1,SETVAL, &valini); 
    op.sem_num=0; 
    op.sem_flg=0; 

    /*Some code here*/ 

    op.sem_op=-1; 
    semop(idsem,&op,1); 

    /*Some code here*/ 

    op.sem_op=1; 
    semop(idsem,&op,1); 
    semctl(idsem,1,IPC_RMID); 
} 

如果我包含頭文件sys/sem.h ...爲什麼可執行文件找不到它?

我在做什麼錯了?

提前感謝和問候,

** * ** * ** * ** * ** 編輯 ** * ** * ** * ** * ****

給出之後,我創建的文件,這樣做,我添加這個問題的答案包括:

#include <fcntl.h> 

我的ftok句話前加上這兩條線:

llave1=open("/tmp/a",O_RDWR|O_CREAT,0644); 
llavesem=open("/tmp/b",O_RDWR|O_CREAT,0644); 

文件被創建,但我仍然有相同的錯誤。

[email protected]/: ls -l /tmp/a 
-rw-r--r-- 1 ubuntu ubuntu 0 Sep 11 00:11 /tmp/a 
[email protected]/: ls -l /tmp/b 
-rw-r--r-- 1 ubuntu ubuntu 0 Sep 11 00:11 /tmp/b 

任何想法?

謝謝!

回答

0

您是否在單獨的進程中創建了信號量?如果沒有,那麼你應該添加IPC_CREAT標誌來讓系統爲你創建一個信號量。如果你沒有指定這個選項並且沒有在另一個進程中創建它,那麼沒有信號量讓你訪問。

一定還要檢查http://linux.die.net/man/2/semget欲瞭解更多信息。

+0

太棒了!我改變了這一行: idsem = semget(llavesem,1,IPC_CREAT); 而不是「0」我把「IPC_CREAT」,它的工作原理! \t 現在我面臨「核心轉儲」失敗:-D – user1660559

+1

我有複製並將附加IPC_CREAT標記的代碼粘貼到測試文件中,它似乎運行時沒有任何錯誤。你能否驗證原始問題中的代碼仍然準確並且會產生錯誤?還有什麼是valini?它沒有在你發佈的代碼中定義,所以我把它做成了一個簡單的int。 –

0

你應該測試是否ftok呼叫 是成功與否的semget (的ftok的第一個參數必須是指現有的,可訪問的文件),在使用它之前。

+0

好的,我用這段代碼創建了這些文件: #include llave1 = open(「/ tmp/a」,O_RDWR | O_CREAT,0644); llavesem = open(「/ tmp/b」,O_RDWR | O_CREAT,0644); 文件被創建: ubuntu @ /:ls -l/tmp/a -rw-r - r-- 1 ubuntu ubuntu 0 Sep 11 00:11/tmp/a ubuntu @ /:ls -l/tmp/b -rw-r - r-- 1 ubuntu ubuntu 0 Sep 11 00:11/tmp/b 但我仍然收到相同的錯誤。有任何想法嗎?謝謝!! – user1660559

相關問題