LINUX.ORG.RU

Проблема с shmget в ALT Linux


0

0

При работе с ALT Linux Compact 2.3, у меня возникла проблема с shmget. Проблема заключается в следующем, создается сегмент разделяемой памяти при помощи shmget, затем программа завершается оставляя его для других программ. Но при выходе, система ведет себя не стандарно, сегмент автоматически удаляется, как это делается при обнлении счетчика использования у файлов. Я проверял, во время выполнения программы сегмент присутствует, ipcs его показывает, а после завершения уже нет. Я проверял тоже самое и с остальными механизмами IPC, проблем не возникало.

Такая же проблема была обнаруженна мной и в МСВС 3. Подскажите пожалуйста, в чем проблема?!

anonymous

Вообще-то тот кто создаёт разделяемую память тот и должен её удалять, а не "оставлять другим программам" иначе потом резко возникают проблемы... Но это так из жизни QNX 4.25...

А в Линухе я так понимаю шаред мемори ни какой нет - есть всемогущие обычные файлы... Почему у тебя они удаляется сами - не знаю. Странно это.

В любом случае механизмы синхронизации System V не люблю, больше люблю механизмы синхронизации POSIX - чего и вам желаю. Например пользоваться исключительно потоками (нитями - pthread_create) - работают и синхронизируются нормально.

Как будут синхронизироваться потоки порождённые из разных процессов - не знаю. Но в Линухе нет синхронизации процессов с помощью POSIX семафоров - отстой, трудно софт переносить из QNX 4.25 в Линух.

Если сейчас к Systen V привяжешся, то потом наверно запаришся переносить софт в другие ОС, например в QNX 6.3

binr ★★
()

У меня всё было нормально: Если прога завершается не удалив шаренную память то она остаётся висеть и мешать повторному запуску сей же программы. Или может ты всётаки сам её удаляеш??? Сделай strace своей проге и посмотри нет ли там shmctl(seg_id,IPC_RMID,0) или чёто подобного.

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

Отвечая сразу на оба ответа скажу, исходно проблема состоит в том, чтобы запустить на ALT Linux а в месте с тем и на МСВС, CA Ingres 2.6. Там при его старте делается следующая вещь: сначала на старте запускается прога, которая производит инициализационную работу - создает разделяемую память (IPC SysV), создает семафоры и что то прописывает в файлы. А после нее стартуют DBMS и прочая сопутствующая байда. Тока вот облом, на ALT и МСВС разделяемая память отваливается сразу как в системе она детачилась - shmdt или просто процесс завершился. Проблема еще в том, что разделяемая память создается с флагом IPC_EXCL (ЭТО Я УЗНАЛ ВСЕ ИЗ ТОГО ЖЕ ПРИСЛОВУТОГО strace), и не получится использовать доплнительную программу которая создаст такой сегмент и придержит этот сегмент на время старта. Разве что бинарку дизассемблировать и потом поправить флаги.

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

to idle:

ssory, offtopik

Я о своих проблемах и других от них предостирегаю ;)

Моя проблема - межплатформенная переносимость не только между процессорами - PowerPC, IntelXScale... но так же нам нельзя привязываться к конкретной ОС, хотя к Линуху мы привязываемся в серьёз и надолго.

По теме думаю что не надо создавать т.н. шаред мемори т.к. её в Линухе нет. Наверно выход - создавать просто файлы. И геммороиться с System V семафорами. :(

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

вы, кажется, думаете, что shmget изобрел Торвальдс?

> По теме думаю что не надо создавать т.н. шаред мемори
> т.к. её в Линухе нет.

и кто же вам это сказал?

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

Бред какой-то. Это как в линухе нет шаред мамори?

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

Слышал от спецов, что скорее всего в Линухе нет шаред мэмори.

Но можно поставить эксперимент, посмотрим атрибуты файлов шаред мэмори в разных ОС:

1. в QNX 4.25 есть каталог "/dev/shmem" в каталоге есть файлы "ls -lt /dev/shmem":

nr-xr-xr-x 1 root root 53248 Jun 11 10:39 rpc_so

nr-xr-xr-x 1 root root 61440 Jun 11 10:39 socket_so

nrw------- 1 root root 4294963200 Dec 31 1969 Physical

2. в Линуксе нет каталога "/dev/shmem", значит появляются сомнения в существовании шаред мемори, но обычно в Линуксе программы создают т.н. шаред мэмори, но атрибуты у них:

"-rw-------"

Атрибуты файлов шаред мемори в QNX 4.25 и Линуксе различаются. ооочень большие сомнения что шаред мэмори существует в Линуксе "в натураном виде", скорее всего её заменяет обычный файл.

Как всё обстоит в FreeBSD и др. не знаю. Вопрос создания POSIX семафора в POSIX шаред мемори для синхронизации процессов стоит для нас очень жёстко. Приходится извращаться с System V.

В книге Уильяма Стивенса "UNIX взаимодействие процессов" (изд-во Питер) Глава 10, Семафоры Posix, страница 239, "10.1.Введение" есть абзац:

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

Красивые слова! Но всё разбивается о суровую реальность - все говорят, что в Линухе процессы можно синхронизовать только через семафоры System V.

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

Из документации к ядру:

glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
POSIX shared memory (shm_open, shm_unlink). Adding the following
line to /etc/fstab should take care of this:
	  
tmpfs   /dev/shm        tmpfs   defaults        0 0
			  
Remember to create the directory that you intend to mount tmpfs on
if necessary (/dev/shm is automagically created if you use devfs).
					
This mount is _not_ needed for SYSV shared memory. The internal
mount is used for that. (In the 2.3 kernel versions it was
necessary to mount the predecessor of tmpfs (shm fs) to use SYSV
shared memory)
								

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

to all: ссори по поводу сравнения каталогов, совсем забыл как раньше это делал... :( Тот пример, который я привёл Линухе касается приложения не использующего shm_open() shm_open() работает, POSIX семафор в ней создаётся, но процессы через него не синхронизируются. Возможно потоки от одного процесса могли бы засинхронизироваться - не проверял.

to RomanU: У меня не получалось через неё засинхронизировать процессы с помощью POSIX семафоров :(

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