Неожиданное завершение в простой дочерней/родительской программе C

Итак, я читал сообщения на StackOverflow и справочной странице форка, и я просто не понимаю поведения, которое вижу, вероятно, потому, что я ищу только то, что ожидаю.

Это простая программа, которая берет имя файла, порождает дочерний элемент, запускает stat() для файла, а затем возвращает SIGUSR1 или 2 обратно родителю в цикле. Родитель просто хочет знать, является ли это 1 или 2 ... Я получаю «Определенный пользователем сигнал 2», а затем программа завершает работу. Но родитель находится в цикле while, верно?

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

pid_t pid;

while(1) {
    if(pid == 0) // i am the child
    {
        FILE *fp = fopen(fname, "r");
        if(fp == NULL){
            printf("%d] Child cannot find [%s].", msg++, fname);
            fclose(fp);
        }
        else {
            stat(fname, &st);
            n = st.st_size;
            printf("%d] Child read %d chars.\n", msg++, n);
            if(n%2) kill(pid, SIGUSR1);
                else kill(pid, SIGUSR2);
        }

    }
    else // im the parent
    {
        if( signal(SIGUSR1,NULL) ) // Code never gets here because it ends
            printf("%s is odd\n", fname );

        if( signal(SIGUSR2, NULL) )
            printf("$s is even\n", fname );

        printf("%d] Enter filenames until you're happy. 'die' to end.\n", msg++);
        scanf("%s", fname);
        pid = fork();
    }

}
return 0;

person Aage Torleif    schedule 30.01.2014    source источник
comment
Потому что родительский процесс завершается до того, как дочерний процесс сможет отправить сигнал родительскому процессу.   -  person Grijesh Chauhan    schedule 30.01.2014
comment
почему родитель заканчивается, если он находится в цикле while?   -  person Aage Torleif    schedule 30.01.2014
comment
Извините, я был неправ! вы не инициализируете pid_t pid;   -  person Grijesh Chauhan    schedule 30.01.2014
comment
Тем не менее, у меня должен быть бесконечный цикл. в основном цикле есть только 1 возврат.   -  person Aage Torleif    schedule 30.01.2014
comment
да, но прочитайте ответ Шакти, у вас отсутствует PID родителя в дочернем   -  person Grijesh Chauhan    schedule 30.01.2014


Ответы (1)


В дочернем элементе pid равен zero, fork возвращает дочерний pid родительскому, но дочерний получает zero, и вы пытаетесь убить процесс с pid 0, но pid инициализации равен 1, вы можете использовать getpid(), чтобы получить текущий pid из child . а потом попробуй подать сигнал.

Изменить: Кроме того, pid не инициализируется, когда цикл входит в первый раз, что также может привести к неопределенному поведению. Спасибо @Giresh

person Sakthi Kumar    schedule 30.01.2014
comment
потому что pid; не присвоено какое-либо значение в if pid == 0, это неопределенное поведение. добавьте в свой ответ Проверьте этот фрагмент кода pid_t pid; while(1) { if(pid == 0) ..... - person Grijesh Chauhan; 30.01.2014
comment
WOOW Sakthi Я не могу поверить, что потратил 2 часа на то, чтобы рвать на себе волосы из-за этого. СПАСИБО! - person Aage Torleif; 30.01.2014
comment
@GrjeshChauhan Спасибо за дополнительную информацию, добавил ее в ответ. - person Sakthi Kumar; 30.01.2014