2009-04-21 2 views
0

Я не понимаю, почему мой код не работает.Что нужно сделать, чтобы изменить мою функцию fork() в C, чтобы работать хорошо?

Это мой код. Я не знаю, почему у меня возникает сегмент ошибок. Может ли кто-нибудь объяснить мне причину?

#include <iostream> 
#include <string> 
#include <sys/types.h> 
#include <unistd.h> 

int id_process; 

void manager_signal() { 
    kill (id_process, SIGKILL); 
    kill (getppid(),SIGKILL); 
} 

int main() { 
    id_process = fork(); 
    if (id_process==-1) { 
     perror("ERROR to create the fork"); 
    } else { 
     if (id_process != 0) { 
      printf("Father´s ID is %d \n", getpid()); 
      alarm(5); 
      (void) signal (SIGALRM, manager_signal); 
      sleep (20); 
      printf ("Running to where the father can be\n"); 
      alarm (0);   
     } else { 
      printf ("CHildren´s ID is %d \n", getpid()); 
      for (;;) { 
       printf ("Children RUN FOREVER ^^"); 
       sleep (2); 
      } 
     } 
    } 
    return 0; 
} 
+0

Это домашнее задание? – ojblass

+1

Может быть домашнее задание. Или просто может быть кто-то, кто начнет изучать C/UNIX. Я оставлю это до роя, чтобы решить, но я дам им преимущество сомнений. – paxdiablo

+1

Этот вопрос не должен быть помечен как «обработка сигнала». Это понятная ошибка, но кто-то с более высокой репутацией, чем я должен повторить этот вопрос. –

ответ

2

Ваш вопрос немного трудно понять, так как вы на самом деле не объяснить, что ошибка, но у меня есть один вопрос, который, я уверен, будет уместен.

Почему «отец» убивает своего ребенка и его родителя ? Не следует ли убивать своего ребенка и его самого (id_process и getpid(), а не getppid(), который является родительским PID)?

Это проблема. Когда я запускаю это под Cygwin, он убивает мою оболочку (пронзительный раздражает). Если бы я изменить его на kill (getpid(),SIGKILL);, он завершается в порядке через пять секунд следующий вывод:

$ vi qq.cpp ; g++ -o qq qq.cpp ; ./qq.exe 
Fathers ID is 6016 
Childrens ID is 4512 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Children RUN FOREVER ^^ 
Killed 

Это с программой изменен следующим образом:

#include <iostream> 
#include <string> 
#include <sys/types.h> 
#include <unistd.h> 

int id_process; 

void manager_signal (int x) { 
    kill (id_process, SIGKILL); 
    kill (getpid(),SIGKILL); 
} 

int main() { 
    id_process = fork(); 
    if (id_process==-1) { 
     perror("ERROR to create the fork"); 
    } else { 
     if (id_process != 0) { 
      printf("Fathers ID is %d\n", getpid()); 
      alarm(5); 
      (void) signal (SIGALRM, manager_signal); 
      sleep (20); 
      printf ("Running to where the father can be\n"); 
      alarm (0); 
     } else { 
      printf ("Childrens ID is %d\n", getpid()); 
      for (;;) { 
       printf ("Children RUN FOREVER ^^\n"); 
       sleep (1); 
      } 
     } 
    } 
    return 0; 
} 
+0

Запустите неисправную программу как: sh -c "./testprog"; то ваша основная оболочка не будет убита. Хорошее определение неправильного определения для manager_signal(); вы можете сделать: void manager_signal (int), чтобы указать, что функция принимает int (номер сигнала), но игнорирует ее? Это была приятная особенность на C++, как я помню, что C тоже преуспел. –

0

Я не думаю, что

kill (id_process, SIGKILL); 

также требуется. Вы убиваете тот же процесс в следующей инструкции.