Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Функция fork() создает процесс потомок с неверным ppid  (Прочитано 1396 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Revan1989

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
В процессе изучения функций fork, exec, wait и т.п. протестировал следующую программу:

#include <unistd.h>
#include <stdio.h>

int main (void) {

        pid_t p;

        printf("Original program,  pid=%d\n",  getpid());
        p = fork();
        if (p == 0) {
                printf("In child process,  pid=%d,  ppid=%d\n",
                        getpid(),  getppid());
        } else {
                printf("In parent,  pid=%d,  fork returned=%d\n",
                        getpid(),  p);
        }
}

Результат следующий:

Original program,  pid=2502
In parent,  pid=2502,  fork returned=2503
In child process,  pid=2503,  ppid=1

То есть ppid процесса-потомка равен 1, а не 2502, как по идее должно быть. pid=1 имеет процесс init, который загружается вместе с системой. Ubuntu 11.10 установлена под VirtualBox, так же пробовал в Ubuntu 13.10 на VmWare результат примерно такой же, процессом-родителем также является init, только pid другой. Попробовал на компьютере, где Ubuntu установлена без виртуалки и получил верные результаты, то есть ppid = 2502. Хотелось бы как-нибудь решить эту проблему потому что ставить вторую ОС нет особой необходимости. К сожалению google не подсказал решение. Спасибо. 

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Когда убивается родитель, то родителем становится init.
Это принцип построения демонов.

Оффлайн Revan1989

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Хорошо, а как это может быть связано с виртуальной машиной? Просто в случае ubuntu, установленной как вторая ос процессом-родителем остается исходный процесс.

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Ну может на реальной машине родитель не успевает умереть. Воткни ожидание в потомка перед получением ид и посмотри что вернется. Скорее всего тоже получишь 1.

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.