m_shmkey = ftok("/srv/www/htdocs/index.cgi", 1);
m_semkey = ftok("/srv/www/htdocs/index.cgi", 2);
m_shmdescr = shmget(m_shmkey, 4, IPC_CREAT|0x0002|0x0004);
m_semdescr = semget(m_semkey, NUMSEM, IPC_CREAT);
m_pShmBuff = (char*)shmat(m_shmdescr, NULL, 0);
(*(int*)m_pShmBuff)++;
Права дочерних процессов apacha
Соответственно при каждом запросе соответствующий cgi-обработчик запроса запускается как дочерний процесс apach-а.
Когда-то, когда сервер работал под виндой синхронизацию процессов обрабочиков я осуществлял с помошью Mutex-ов. Теперь кога сервер
работает под Linux-ом я для тех же цеоей стал использовать Семафоры и Разделяемую память. Когда я компилирую cgi-модуль и запускаю его
просто как программу (из под root-а) - он нормально и без ошибок выполняется и даже в stdout выдаёт сформированный ответ как надо,
а вот как только захожу на сервер через FireFox (т.е. фактически посылаю запрос на соотв. cgi и он запускается уже не из под root-а
а как дочерний процес от apach-а) тогда этот cgi процесс вылетает с ошибкой... И что примечательно, как только закоментариваю участки кода связанные с записью и удалением share memory так сразу становится всё номально.
-----------------------------------------------------
Я так понимаю у дочерних процессов apach-а нет прав на запись и удаление расшаренной памяти и из-за этого вся проблема. Как эту проблему решить? Т.е. как разрешить этим процессам ну хотябы писать
в расшаренную память...
Что мешает при формировании общий памяти, задать ей соответствующие права, а не только права суперпользователя? Насколько я знаю shmget вполне это позволяет, и имеет одним из своих параметров как раз права доступа.
Добавил флаги 0x0002 и 0x0004 и результат тотже...
т.е. флаги я сейчас передаю такие: IPC_CREAT|0x0002|0x0004
Цитата:
SHM_R Read access for user.
SHM_W Write access for user.
(SHM_R>>3) Read access for group.
(SHM_W>>3) Write access for group.
(SHM_R>>6) Read access for other.
(SHM_W>>6) Write access for other.
SHM_W Write access for user.
(SHM_R>>3) Read access for group.
(SHM_W>>3) Write access for group.
(SHM_R>>6) Read access for other.
(SHM_W>>6) Write access for other.
или соответствующие для open(2)
... но вроде это тоже самое.
А что пишет strerror(errno) в месте слета? Или вылетает по сигналу? (про отлов и анализ сигналов, темка мелькала в разделе недавно).
Привел бы хоть код для начала, или он у тебя шароварез?!
Под виндой я просто влеплял в нужном месте отладочное
прерывание и при выполнении процесса на нужной точке у меня сам запускался отладчик...
расшаренной памяти и увидел, что если запуск идёт с
apacha то shmget() возвращает -1.
Есть ли в лине чё нибудь типа GetLastError()?
Цитата:
Привел бы хоть код для начала
Ну, всегда пожлайлуста:
Код:
-------------------------------------------------
Я ж первый раз создал share memory из под root-а, а потом когда поменял флаги и перекомпилировал программу, она пыталась создать
share memory по тому же ключу или получить уже созданную, но так как
разделяемая память уже создана - она не пересоздавалась с новыми параметрами :)
- удалил shm и запустился заново - всё зароботало.