LINUX.ORG.RU

Синхронизация процессов


0

0

Пытался засинронизировать процессы как в QNX 4.25: именнованая память shm_open(), в ней семафор sem_init(), sem_wait(). Не работает.

Как решить задачу синхронизации?

anonymous

Семафоры: смотри sem_open() - все прекрасно работает - только нужно примонтировать tmpfs в /dev/shm

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

$ cat /proc/filesystems | grep tmpfs
nodev tmpfs

если нет - пересобирай ядро с включенной опцией [*] Virtual memory file system support (former shm fs) это в File Systems.

потом:
mount -t tmpfs tmpfs /dev/shm/

иначе будет ругаться типа not implemented

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

Хотя помнится это было с shm_open а не с sem_open на sem_open даже при приманченной tmpfs ругалось :(
Ну заюзай тогда Sys V семафоры, правда там уродский ftok()

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

Спасибо, я добавил строку в fstab: tmpfs /dev/shm tmpfs defaults 0 0

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

shm_open() вроде работает, процессы даже показывают одинаковый указатель на именнованную shared memory. Раньше такого не было - когда я не монтировал tmpfs процессы обменивались данными через именнованную shared memory, но указатели на неё были разными.

Cейчас пытаюсь делать семафоры sem_init() и sem_wait() -- но пока синхронизации процессов добиться не удалось, создаётся ощущение, что процессы работают сами посебе. Что надо перепроверить или где почитать по этой теме? HELP!

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

Читай R. Stevens, UNIX Network Programming.
Есть перевод на русский язык в двух томах:
UNIX: разработка сетевых приложений (У.Стивенс)
и
UNIX: взаимодействие процессов (У.Стивенс)

Можно заказать их на сайте издательства "Питер" www.piter.com

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

Обе книги есть. В частности "UNIX взаимодействие процессов"

Цитат из неё: стр 237, ГЛАВА 10 Семафоры Posix

10.1 Введение .... Мы рассматриваем три типа семафоров: *именованные семафоры... *размещаемые в разделяемой памяти семафоры Posix *семафоры System V (глава 11), обслуживаемые ядром.

Все три типа семафоров могут использоваться для синхронизации как отдельных процессов, так и потоков одного процесса.

Вот я чем и занимаюсь: "*размещаемые в разделяемой памяти семафоры Posix" и "синхронизации как отдельных процессов" и ни чего не получается.

100 лет назад в рамках одного процесса потоки синхронизировались нормально. Сейчас засинхронизировать процессы через Posix семафоры размещаемые в именованной разделяемой памяти не получается.

Где искать exampl-ы ? Где искать форумы по ядерным примочкам?

HELP!!!!!!!!!!!!!!!!

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

Всё сделал. Скачал примеры, откомпилил библиотеки (добавил -lrt в переменную LIBS, файл Make.defines иначе линкер ругается на отсуствие shm_open()).

Откомпилил пример pxshm, т.к. тут создаются POSIX семафоры в именнованой разделяемой памяти - программа server2

Но она пишет ошибку:

"shm_open error for /tmp/test: No such file or directory"

Но по исходникам кажется, что она должна его создавать...

Зачем Стивенс использует Px_ipc_name() пока не понял... обмен данными между процессами работал и без него.

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

Px_ipc_name() выкинул к чертям собачьим... именнованую память стало создавать как положено в /dev/shm , но sem_init() not implemented

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

Вот нашел в man-е по LinuxThreads:

sem_init

initializes the semaphore object pointed to by sem. The count associated with the semaphore is set initially to value. The pshared argument indicates whether the semaphore is local to the current process ( pshared is zero) or is to be shared between several processes ( pshared is not zero).
LinuxThreads currently does not support process-shared semaphores, thus sem_init always returns with error ENOSYS if pshared is not zero.

Т.е. семафоры POSIX в разделяемой памяти в Linux не поддерживаются. Для синхронизации процессов прийдется использовать SysV семафоры.

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

Тяжко однако. Стивенс тем не менее пытался делать POSIX семафоры в разделяемой памяти... и не работает...

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