2013-12-19 3 views
1

Мне нужно родительский процесс закончился раньше, чем детский процесс. Это код:Как убить родительский процесс до завершения ребенка?

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
main() 
{ 
    extern int errno; 
    extern char* sys_errlist[]; 
    pid_t pid; 
    int rv; 
    switch(pid=fork()) { 
     case -1: 
      perror("fork"); 
      exit(1); 
     case 0: 
      printf(" CHILD: This is child-process!\n"); 
      printf(" CHILD: My PID -- %d\n", getpid()); 
      printf(" CHILD: My parent PID -- %d\n", getppid()); 
      sleep(3); 
      printf(" CHILD: My new parent PID -- %d\n", getppid());//I think, that getppid() return 1 
      printf(" CHILD: Exit!\n"); 
      exit(rv); 
     default: 
      printf("PARENT: This is parent-process!\n"); 
      printf("PARENT: My PID -- %d\n", getpid()); 
      printf("PARENT: My child PID %d\n",pid); 
      printf("PARENT: Exit!\n"); 
    } 
} 

Но я не уверен, что это правильно. Выход этой программы:

PARENT: This is parent-process! 
PARENT: My PID -- 943 
PARENT: My PID -- 943 
PARENT: My child PID -- 944 
PARENT: Exit! 
CHILD: This is child-process! 
CHILD: My PID -- 944 
CHILD: My parent PID -- 1 
CHILD: My new parent PID -- 1 
CHILD: Exit! 

Спасибо! PS. Прошу прощения за мой английский

+0

Добро пожаловать на переполнение стека. Вскоре прочитайте страницу [О программе]. Ваш английский был вполне понятен. Я бы написал: «Мне нужно, чтобы родительский процесс заканчивался раньше, чем дочерний процесс». –

+0

Последующий вопрос - почему вам нужно, чтобы родитель закончил раньше. Если это просто для базовых целей тестирования, вы можете просто положить достаточно длинный «sleep» в дочерний элемент и выйти из родителя. Или вам нужно более долгое решение для реальной проблемы? Если это так, вы должны объяснить, что это за проблема. – Duck

+0

@ Duck: существует множество причин, по которым дочерний процесс должен пережить его родительский элемент, не в последнюю очередь, когда родитель запускает процесс фона или демона. –

ответ

1

Похоже, что ваш родительский процесс вышел до того, как ребенок даже начал спать. Это возможно, потому что ваш родитель не делает ничего, что занимает значительное количество времени после создания ребенка. Он просто печатает и завершает работу. Таким образом, ребенок видел PPID 1 еще до сна.

Если вы добавите sleep(1) в конец родителя, будет гораздо больше шансов, что ребенок напечатает 2 разных идентификатора PPID.

Если это не сработает, вам нужно будет выполнить некоторую фактическую синхронизацию, чтобы ваши процессы выполнили шаги в правильном порядке. Спальные места не очень хороши для этого, потому что вы не можете контролировать, сколько времени занимает других предметов (включая время, в течение которого ваши процессы не работают вообще, потому что что-то еще взяло процессор).

1

Выход выглядит нормально. Родительский процесс, как представляется, выходит; родительский процесс не влияет на дочерний процесс и продолжает печатать свой вывод тоже.

Вы можете видеть, что родитель ребенка изменился при выходе родителя; сироты наследуются с помощью идентификатора процесса 1, который просто сидит там, ожидая смерти детей. PID 1 классически является процессом init (хотя, например, в Mac OS X это /sbin/launchd).

1

Возможно, что вы, кажется, не хватает какой-то форма синхронизации между этими двумя процессами, которые могут быть дружнее, например, с помощью сигналов, труб и т.д. ... Вы выбираете

Чтобы обеспечить порядок выполнения:

  • родительских после fork() печати своих вещей, сказать ребенку, чтобы разбудить и выход immeditly после
  • ребенка ждать, прежде чем он просыпался, а затем напечатать свой материал на свою очереди.

sleep() является не синхронизации примитив (но может быть удобно для простых вещей)

Смежные вопросы