[Volgograd] shm
Serge S. Fukanchik
fuxx на solvo.ru
Пт Окт 10 11:51:43 MSD 2003
Дмитрий Коржевский писал мне ранее:
>/* в основном процессе */
>id = shmget(0x0103018d, 0x000f4240, 950);
>/* id == 0x0c6d0006 */
>a = shmat(0x0c6d0006, 0, 0);
>/* a == 0x4046b000 */
>vfork(...);
>/* в дитяте */
>execve(.../* новый код */);
>/* в новом коде */
>b = shmat(0x0c6d0006, 0, 0);
>/* b == -1 */
Очень странно. У меня все работает на RH9 и RH73 (см. пример).
1. Какая у тебя версия ядра?
2. Это произошло после перехода на новую версию ядра?
3. Есть ли у тебя в /etc/fstab такая строка:
none /dev/shm tmpfs defaults 0 0
?
4. Если у тебя есть исходники этой проги, попробуй выводить errno после получения
ошибки, если исходников нет, значение errno можно получить в gdb, поставив breakpoint
на точку после вызова shmat в childе.
5. Внимательно просмотри лог strace, не происходит ли между вызовами каких-либо
действий.
6. Посмотри, не завершается ли родительский процесс ДО вызова shmat в дочернем.
Если это так, то область удаляется из-за того что умерли все ее владельцы.
--
HAIR TONICS, please!!
----------- следущая часть -----------
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main( int argc, char *argv[])
{
int id;
void *ptr;
id = shmget ( 12345, 4096, IPC_CREAT | 0666 );
printf ( "parent id=%x\n", id );
ptr = shmat ( id, 0, 0 );
printf ( "parent ptr=%p\n", ptr );
if ( !vfork () )
{
char sid[256];
sprintf ( sid, "%d", id );
char *args[3];
args[0]="./chld";
args[1]=sid;
args[2]=0;
execve ( "./chld", args, 0 );
perror ( "execve" );
return 0;
}
int status;
wait (&status);
return 0;
}
----------- следущая часть -----------
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int arc, char *argv[])
{
int id;
void *ptr;
id = atoi ( argv[1] );
printf ("child id=%x\n", id );
ptr = shmat ( id, 0, 0 );
printf ( "child ptr=%p\n", ptr );
return 0;
}
Подробная информация о списке рассылки Volgograd