[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