C++ C++;:semget:返回enoint #包括 #包括 #包括 #包括 使用名称空间std; 主要(){ string key=“/m/lb1/activity.log”; int sem_key=ftok(key.c_str(),1); if(访问(key.c_str(),R_OK)==0) printf(“密钥路径可访问\n”); printf(“sem\u getid:%d”,sem\u键); errno=0; int sem_id=semget(sem_键,0,0655); printf(“sem get val:%d:%s\n”,sem_id,strerror(errno)); } 美元/年 密钥路径是可访问的 sem_getid:16850172 sem get val:-1:没有这样的文件或目录 ls-l/m/lb1/activity.log -rw-r--r--1苹果g6 0二月9日19:08/m/lb1/activity.log

C++ C++;:semget:返回enoint #包括 #包括 #包括 #包括 使用名称空间std; 主要(){ string key=“/m/lb1/activity.log”; int sem_key=ftok(key.c_str(),1); if(访问(key.c_str(),R_OK)==0) printf(“密钥路径可访问\n”); printf(“sem\u getid:%d”,sem\u键); errno=0; int sem_id=semget(sem_键,0,0655); printf(“sem get val:%d:%s\n”,sem_id,strerror(errno)); } 美元/年 密钥路径是可访问的 sem_getid:16850172 sem get val:-1:没有这样的文件或目录 ls-l/m/lb1/activity.log -rw-r--r--1苹果g6 0二月9日19:08/m/lb1/activity.log,c++,semaphore,C++,Semaphore,“access”调用返回0;这样就可以打印出关键路径。但是,semget正在返回一个enoint(没有这样的文件或目录) sem_getid:16850172 sem get val:-1:没有这样的文件或目录 这里可能出了什么问题 semget获取现有信号量集,除非在第三个参数中指定IPC\u create或IPC\u PRIVATE。从man semget: 在本例中,enoint表示信号量集不存在,而不是表示路径不存在。semget获取现有信号量集,除非在第三个参数中指定IPC\u cre

“access”调用返回0;这样就可以打印出关键路径。但是,semget正在返回一个enoint(没有这样的文件或目录)

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


这里可能出了什么问题

semget
获取现有信号量集,除非在第三个参数中指定
IPC\u create
IPC\u PRIVATE
。从
man semget


在本例中,
enoint
表示信号量集不存在,而不是表示路径不存在。

semget
获取现有信号量集,除非在第三个参数中指定
IPC\u create
IPC\u PRIVATE
。从
man semget


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

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


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

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


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

对于Chris Dodd之前的回答,这是不精确的,因为该键是由()函数生成的,该函数采用路径和整数id,并返回适合semget()的键。关于Chris Dodd的上一个答案,它是不精确的,因为键是由()函数生成的,该函数采用路径和整数id,并返回适合semget()的键。
    #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
ENOENT
    No semaphore set exists for key and semflg did not specify IPC_CREAT.