0

このコードを機能させようとしていますが、機能しません。コンパイルエラーや警告を表示しないコードを作成できましたが、実行しようとすると次のエラーで失敗します。

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文の前に次の2行を追加します。

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 

何か案は?

ありがとう!!

4

2 に答える 2

0

ftokで使用する前に、呼び出しが成功したかどうかをテストする必要がありsemget ます(の最初の引数はftok、既存のアクセス可能なファイルを参照する必要があります)。

于 2012-09-10T21:39:06.207 に答える
0

別のプロセスでセマフォを作成しましたか?そうでない場合は、フラグIPC_CREATを追加して、システムにセマフォを作成させる必要があります。このオプションを指定せず、別のプロセスで作成していない場合、アクセスするためのセマフォはありません。

詳細については、 http://linux.die.net/man/2/semgetも確認してください。

于 2012-09-10T22:55:20.407 に答える