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またはを3番目の引数で指定しない限り、既存のセマフォセットを取得します。差出人: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 に答える