Пожинает зомби процесс - ребенок - PullRequest
2 голосов
/ 01 марта 2010

Я передаю аргументы командной строки на главную от родителя к потомку, считаю их и печатаю Мой вопрос в том, что я не уверен, что пожинаю ребенка? Разве мне просто не нужен выход 0 или мне нужно снова вызвать fork?

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{

int length = 0;
int i, n;

int     fdest[2];          // for pipe
pid_t   pid;              //process IDs
char    buffer[BUFSIZ];


if ((pid = fork()) < 0)  /* attempt to create child / parent process */

{
    printf("fork error");
} 

if (pipe(fdest) < 0)          /* attempt to create pipe */
    printf("pipe error");

/* parent process */
else if (pid > 0) {      
    close(fdest[0]);

    for(i = 1; i < argc; i++)    /* write to pipe */
    {
        write(fdest[1], argv[i], strlen(argv[1]));
    }

} else {   

    /* child Process */
    close(fdest[1]);

    for(i = 1; i < argc; i++)
    {
        length +=( strlen(argv[i])); /* get length of arguments */
    }

    n = read(fdest[0], buffer, length);
    printf("\nchild: counted %d characters\n", n);

}
exit(0);
}

1 Ответ

11 голосов
/ 01 марта 2010

Нет, вы неправильно пожинаете ребенка. В вашем случае, если дочерний процесс завершится до завершения родительского процесса, дочерний процесс станет зомби. Затем, когда родительский процесс завершится, дочерний процесс будет переименован в init (независимо от того, закончил ли он, является ли он зомби или все еще работает). init тогда пожинает ребенка для вас.

Чтобы пожинать ребенка, добавьте вызов к wait() до exit.

Кстати, у вас есть еще одна ошибка - вы создаете канал после fork, поэтому каждый из родителей и потомков создает (разные) каналы - они не связаны. Переместите if (pipe(... вверх до fork().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...