2013-02-10 2 views
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 (Нет такого файла или каталога)C++: semget: Возвращает ENOENT

sem_getid: 16850172 семафор получаю Вэл: -1: Нет такого файла или каталога

Что может быть не так?

ответ

2

semget получает набор семафоров существующего, если не указан IPC_CREAT или IPC_PRIVATE в третьем аргументе. От man semget:

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

В этом случае ENOENT означает, что набор семафоров не существует, а не означает путь не существует.

1

sem_key вы передаете semget не имя файла или путь, его просто произвольное 32-разрядное целое число. Пространство имен возможных ключей семафора никак не связано с пространством имен файлов.

Поэтому вам нужно выбрать какое-либо (целочисленное) значение ключа для использования, и вам нужно фактически создать ключ перед его использованием, сначала вызов semget с IPC_CREAT.

+0

В отношении предыдущего ответа Криса Додда неточно, потому что ключ генерируется функцией [ftok] (http://pubs.opengroup.org/onlinepubs/007904975/functions/ftok.html)(), которая принимает путь и целочисленный id и возвращает ключ, подходящий для semget(). –

Смежные вопросы