Что я должен сделать, чтобы мой fork () в C работал нормально? - PullRequest
0 голосов
/ 21 апреля 2009

Я не понимаю, почему мой код не работает.

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

#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;
}

Ответы [ 2 ]

2 голосов
/ 21 апреля 2009

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

Почему процесс "отец" убивает своего ребенка и его родителя ? Разве он не должен убить своего ребенка и себя (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 голосов
/ 09 февраля 2010

Я не думаю

    kill (id_process, SIGKILL);

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

...