LINUX.ORG.RU

sem_open


0

0

Помогите плиз! Как создать семафор? То, что я сделал работает только под 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 - не помогло.

Ответ на: комментарий от anonymous

>semget не то что надо ?

вообщето это из другой оперы.

cvv ★★★★★
()
Ответ на: комментарий от cvv

С именами эксперементировал и с правами и т. д. Более того на разных дистрибутивах и ядрах. Даже на 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?

karak
() автор топика
Ответ на: комментарий от karak

sname в вашем случае это полное имя "файла-семафора". По пути который вы указываете у вас нету прав на запись или создание файлов. Дайте права и всё поедет.

cvv ★★★★★
()
Ответ на: комментарий от cvv

>sname в вашем случае это полное имя "файла-семафора"

уточните имя может быть и относительным. я здесь погорячился.

cvv ★★★★★
()
Ответ на: комментарий от Onanim

может ещё пусть сделает

#cat /etc/fstab

#cat /proc/mounts

PS: мне не приходилось встречать намёки что эта штука на линуксе требует tmpfs смонтированным на /dev/shm. Это действительно так?

cvv ★★★★★
()
Ответ на: комментарий от cvv

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!

На Solaris - по-другому.

Ты же вроде Стивенса покупал... чо, ниасилил?

HTH

Onanim
()
Ответ на: комментарий от cvv

> может ещё пусть сделает

> #cat /etc/fstab

> #cat /proc/mounts

Зачем? Если от root'а работает, значит смонтирована.

> PS: мне не приходилось встречать намёки что эта штука на линуксе
> требует tmpfs смонтированным на /dev/shm. Это действительно так?

Никогда не видел, чтобы POSIX IPC на Linux работали без
смонтированного /dev/shm.

Onanim
()
Ответ на: комментарий от Onanim

когда я изучал POSIX IPC меня в первую очередь интересовала шаренная память, а что касается семафоров и прочего то это я читал по диагонали.

>Ты же вроде Стивенса покупал... чо, ниасилил?

там не написано что под линуксом вызов sem_open() требует смонтированой tmpfs на /dev/shm а Documentation/filesystems/tmpfs.txt говорит только о shm_open() а не posix ipc вобщем

cvv ★★★★★
()
Ответ на: комментарий от Onanim

>> может ещё пусть сделает

>> #cat /etc/fstab

>> #cat /proc/mounts

>Зачем? Если от root'а работает, значит смонтирована.

дабы посмотреть на опции монтирования

cvv ★★★★★
()
Ответ на: комментарий от karak

Действительно, после того как для /dev/shm установил rwx для всех, все сразу чудесным образом заработало. Спасибо за помощь :-).

karak
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.