我试图让这段代码正常运行,但我无法做到。我设法创建一些没有显示任何编译错误或警告的代码,但是当我尝试执行它时失败并出现此错误:
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
有什么想法吗?
谢谢!
答案 0 :(得分:0)
你应该测试ftok
是否打电话
在semget
中使用它之前是否成功
(ftok
的第一个参数必须引用现有的可访问文件。
答案 1 :(得分:0)
您是否在单独的流程中创建了信号量?如果没有,那么您应该添加标志IPC_CREAT以让系统为您创建信号量。如果您没有指定此选项但尚未在另一个进程中创建它,则没有信号量可供您访问。
请务必查看http://linux.die.net/man/2/semget以获取更多信息。