0
    #include <sys/sem.h>
 #include <sys/stat.h>
#include <cerrno>
#include <iostream>
using namespace std;


main () {
    string key = "/m/lb1/activity.log";
    int sem_key = ftok (key.c_str (), 1);
    if (access (key.c_str (), R_OK) == 0)
        printf ("keypath is accessible \n");
    printf("sem_getid : %d", sem_key);
    errno = 0;
    int sem_id = semget (sem_key, 0, 0655);
    printf( " sem get val :%d :%s\n", sem_id, strerror(errno));
}
$ ./a.out
keypath is accessible
sem_getid : 16850172 sem get val :-1 :No such file or directory


ls -l /m/lb1/activity.log
-rw-r--r-- 1 apple g6 0 Feb 9 19:08 /m/lb1/activity.log

“访问”调用返回 0;所以键路径被打印出来。但是,semget 正在返回一个 ENOENT(没有这样的文件或目录)

sem_getid:16850172 sem get val:-1:没有这样的文件或目录

这里有什么问题?

4

2 回答 2

2

semget除非您在第三个参数中指定或,否则获取现有的信号量集。来自:IPC_CREATIPC_PRIVATEman semget

ENOENT
    No semaphore set exists for key and semflg did not specify IPC_CREAT. 

在这种情况下,ENOENT意味着信号量集不存在,而不是意味着路径不存在。

于 2013-02-10T04:22:16.087 回答
1

您传递给 semget的sem_key不是文件名或路径,它只是一个任意的 32 位整数。可能的信号量键的命名空间与文件名空间没有任何关系。

因此,您需要选择一些(整数)键值来使用,并且您需要在使用它之前实际创建键,首先使用 IPC_CREAT 调用 semget。

于 2013-02-10T04:31:29.003 回答