Гость Опубликовано 2 февраля, 2004 Жалоба Опубликовано 2 февраля, 2004 Здравствуй ALL! В QNX 4.25 при создании именованой Shared Memory в одном процессе, и открытии в другом процессе возращают указатели на один и тот же адрес памяти. Этой памятью можно пользоваться для межпроцессного обмена данными и созданием семафоров(!). В Линухе я заметил, что процессы возвращают указатели на разные участки памяти(!), но обмен данными между процессами идёт. А вот с семафорами атас - не работают. Насколько я понимаю процессы в Линуховом ядре работают с физически РАЗНЫМИ shared memory, но ядро скрыто от них занимается копированием данных из одной памяти в другую. Я прав или ошибаюсь? Если прав, то от чего это зависит? (старая версия ядра и т.д.) Можно ли процессы заставить пользоваться физически одной и той же shared nmemory ? Можно ли заставить процессы нормально работать с семафорами через shared memory? Работают ли именованая память и семафоры в ядре 2.6 как положено? Вопросы возникают в связи с портированием кода из QNX 4.25 в Линух. Цитата
Гость Опубликовано 5 февраля, 2004 Жалоба Опубликовано 5 февраля, 2004 Что знаю - расскажу. Не то, не то вы думаете. Семафор это различное от разделяемой памяти понятие Сис5ипц. То есть, "нормально работать с семафорами через shared memory" - это не есть верная постановка задачи. Шаред мемори не используется при создании и использовании семафора. Бегло проглядев примеры к труду Стивенса по сетевому программированию в юникс увидел, что указатель на начало разделяемой памяти во всех процессах указывал в одну и ту же ячейку. Система на ядре 2.6.0. Не думаю, что в предыдущих версиях было что-то неверно в реализации сис5ипц. Вызов shmat() СТЫКУЕТ разделяемую память к адресному пространству процесса, причём по адресу, который зависит от второго и третьего аргумента shmat(shmid, shmaddr, shmflag) Цитата
Гость Опубликовано 5 февраля, 2004 Жалоба Опубликовано 5 февраля, 2004 Спасибо большое за ответ. Просто в QNX 4.25 два процесса хорошо синхронизировались семафорами (POSIX sem_init()) через именнованую память, там же лежали данные. В Линухе и то не в каждом ядре работает shm_open() , но синхронизации между процессами просто нет. Именованные семафоры POSIX sem_open() пишут - function not implemented. Сложно портировать под Линух готовые задачи однако Цитата
Гость Опубликовано 8 июня, 2004 Жалоба Опубликовано 8 июня, 2004 В Линухе есть semop(2) & Co. Посиксовские семафоры (по крайней мере на тех ядрах/глибцах, с коими я работаю) реализованы не до конца. И синхронизацию обеспечивают только между нитками одного процесса, но не между разными процессами (какой-то SHARED-флаг, отвечающий за это просто выбрасывает системный запрос с ошибкой, /я под виндой сейчас - мне не проверить/). Я тоже занимаюсь портированием кода из-под qnx 4.x в Линукс. И мой совет пользоваться семафорами sysV_IPC. Вы же память открывкаете shmget-ом? Там ключ нужен. Его же можно использовать и для семафоров. Пока что семафоры сис5 не вызывали нареканий у меня. Но код переделать надо будет хорошо Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.