Помогите плиз! Как создать семафор? То, что я сделал работает только под root-ом. Под user-ом выдает: Permission denied!
sem_t *Sem_open( char *sname, char *file, int line)
{
sem_t *semid = sem_open( sname, (O_CREAT|O_EXCL), (S_IWOTH|S_IROTH), 1 );
//printf(" Sem_open: sem = 0x%X\n", (int)semid);
if( semid == SEM_FAILED ) {
printf( "\n FILE %s, LINE %d, %s", file, line, strerror( errno ) );
return semid;
}
//Sem_getvalue( semid, NULL, sname, file, line );
return semid;
}
Спасибо. P.S. Эксперементировал с разными oflag и mode_t - не помогло.
С именами эксперементировал и с правами и т. д. Более того на разных дистрибутивах и ядрах. Даже на Free BSD. В общем пример (из книги Уильяма Стивенса UNIX взаимодействие процессов) мне не удалось запустить не из под root. Привожу почти его код...
#include <...>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(int argc, char *argv[])
{
int c, flags;
sem_t *sem;
unsigned int value;
flags |= O_RDWR|O_CREAT;
value = 1;
while((c = getopt(argc, argv,"ei:")) != -1){
switch(c){
case 'e':
flags |= O_EXCL;
break;
case 'i':
value = atoi(optarg);
break;
}
}
if(optind != argc - 1){
printf("usage: semcreate [-e] [-i initval] <name>");
return -1;
}
sem = sem_open(argv[optind], flags, FILE_MODE, value);
if(sem == SEM_FAILED) {
printf("sem_open: Error %s\n", strerror(errno));
return -2;
}
sem_close(sem);
return 0;
}
Подскажите плиз! Как заставить это работать не под root?
sname в вашем случае это полное имя "файла-семафора". По пути который вы указываете у вас нету прав на запись или создание файлов. Дайте права и всё поедет.
2 cvv :
> уточните имя может быть и относительным. я здесь погорячился.
Блин, ну может книжку прочитаешь, а?
Имена POSIX IPC это не совсем то же самое, что имена традиционных
Unix-файлов/пайпов/сокетов... Имя POSIX IPC вообще не обязано
соответствовать какому-либо объекту файловой системы. На практике
оно часто соответствует, но не совсем обычным образом.
Например (в Linux) при создании семафора с именем some_posix_sem
будет создан файл /dev/shm/sem.some_posix_sem. И при задании имени
как абсолютного /some_posix_sem будет создан тоже /dev/shm/sem.some_posix_sem. Surprise!
когда я изучал POSIX IPC меня в первую очередь интересовала шаренная память, а что касается семафоров и прочего то это я читал по диагонали.
>Ты же вроде Стивенса покупал... чо, ниасилил?
там не написано что под линуксом вызов sem_open() требует смонтированой tmpfs на /dev/shm а Documentation/filesystems/tmpfs.txt говорит только о shm_open() а не posix ipc вобщем