C++ : semget : Returns ENOENT
C++ : semget : Returns ENOENT
#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 :%sn", 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
"access"调用返回0;所以关键路径被打印出来。然而,semget返回一个ENOENT(没有这样的文件或目录(
sem_getid:16850172sem获取val:-1:没有这样的文件或目录
这里可能出了什么问题?
semget
获取现有信号量集,除非在第三个参数中指定IPC_CREAT
或IPC_PRIVATE
。来自man semget
:
ENOENT No semaphore set exists for key and semflg did not specify IPC_CREAT.
在这种情况下,ENOENT
意味着信号量集不存在,而不是意味着路径不存在。
传递给semget的sem_key
不是文件名或路径,它只是一个任意的32位整数。可能的信号键的命名空间与文件名空间没有任何关系。
因此,您需要选择一些(整数(键值来使用,并且在使用之前需要实际创建密钥,方法是首先使用IPC_CREAT调用semget。
相关文章:
- CreateWICTextureFromFile returns E_NOINTERFACE
- cl::Event::waitForEvents returns -7 (CL_EXEC_STATUS_ERROR_ F
- vector[0].getPosition() returns 0
- CreateInputLayout returns E_INVALIDARG
- ldap_search_s returns LDAP_OPERATIONS_ERROR
- CreateCompatibleDC(IntPtr.Zero) returns IntPtr.Zero
- glUniformLocation returns -1
- 为什么从unistd.h调用crypt()函数会将errno设置为ENOENT?
- DirectX9 CreateOffscreenPlainSurface returns D3DERR_INVALIDC
- OpenGL glReadPixels returns 0
- gdk_screen_get_default() returns null
- UIAutomation: AddAutomationEventHandler() returns E_INVALIDA
- C++ _snprintf returns -1
- CryptHashData returns ERROR_INVALID_PARAMETER (CAPI)
- FindClass returns null
- QEnableSharedFromThis::sharedFromThis() returns nullptr
- SDL_ttf TTF_OpenFont returns NULL
- QSslSocket and supportsSsl() returns false
- readlink 将 errno 设置为 ENOENT
- C++ : semget : Returns ENOENT