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 语句之前添加了这两行:

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 回答