Создать новые процессы и ожидать выхода - PullRequest
2 голосов
/ 07 марта 2012

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

#include <stdio.h> /* printf, stderr, fprintf */
#include <sys/types.h> /* pid_t */
#include <unistd.h> /* fork */
#include <stdlib.h> /* _exit */
#include <errno.h> /* errno */

int main()
{
    pid_t writer;
    pid_t reader;

    writer = fork();
    if (writer == -1)
    {
        fprintf(stderr, "can't fork, error %d\n", errno);
        exit(1);
    }

    if (writer == 0)
    {
        printf("Writer process created.\n");
        reader = fork();
        if (reader == -1)
        {
            fprintf(stderr, "can't fork, error %d\n", errno);
            exit(1);
        }

        if (reader == 0)
        {
            printf("Reader process created.\n");
            kill(reader);
            printf("Reader was successfully murdered.\n");
        }
        kill(writer);
    }
    wait();
    printf("Writer killed.\n");
    return 0;
}

В идеале я хотел бы, чтобы вывод получился следующим:

Writer process created.
Reader process created.
Reader was successfully murdered.
Writer killed.

Но с этого момента он выдает:

Writer process created.
Reader process created.
Reader was successfully murdered.
Writer killed.
Writer killed.
Writer killed.

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

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

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

#include <stdio.h> /* printf, stderr, fprintf */
#include <sys/types.h> /* pid_t */
#include <unistd.h> /* fork */
#include <stdlib.h> /* _exit */
#include <errno.h> /* errno */
#include <string.h> /* strlen */

int main()
{
    pid_t writer;
    pid_t reader;
    char buf;
    int pipefd[2] = {-1,-1};
    const char* pcszTextToChild = "Text sent to child";

    writer = fork();
    if (writer == -1)
    {
        fprintf(stderr, "can't fork, error %d\n", errno);
        exit(1);
    }

    if (writer == 0)
    {/* writer process */
        printf("Writer process created.\n");
        if(pipe(pipefd) == -1)
        {
           perror("pipe");
           exit(EXIT_FAILURE);
        }
        reader = fork();
        if (reader == -1)
        {
            fprintf(stderr, "can't fork, error %d\n", errno);
            exit(1);
        }

        if (reader == 0)
        {/* reader process */
            close(pipefd[1]);  /* Close unused write end */
            printf("Reader process created.\n\tReading: ");
            fflush(stdout);
            while (read(pipefd[0], &buf, 1) > 0)
                write(STDOUT_FILENO, &buf, 1);
            write(STDOUT_FILENO, "\n", 1);
            close(pipefd[0]);
            printf("Exiting reader process.\n");
            exit(EXIT_SUCCESS);
        }
        else
        {/* writer process */
            close(pipefd[0]);          /* Close unused read end */
            write(pipefd[1], pcszTextToChild, strlen(pcszTextToChild));
            close(pipefd[1]);          /* Reader will see EOF */
            wait(NULL);                /* Wait for child */
            printf("Exiting writer process.\n");
            exit(EXIT_SUCCESS);
        }
    }
    wait();
    return 0;
}

Результат:

Writer process created.
Reader process created.
    Reading: Text sent to child
Exiting reader process.
Exiting writer process.
0 голосов
/ 07 марта 2012

Вы ничего не убиваете.Есть много ошибок компилятора, которые вам удалось избежать, поэтому я добавил несколько заголовочных файлов и оставил ошибки в kill () и wait ().Также подумайте о том, чтобы поймать коды возврата и обратить на них внимание.С правильными заголовками и / или перехватом ошибок вы бы видели ваши проблемы раньше.Попробуйте скомпилировать и посмотреть, почему вещи не делают то, что вы хотели.Исправьте ошибки, и все улучшится.

#include <sys/types.h> /* pid_t */
#include <sys/wait.h>
#include <stdio.h> /* printf, stderr, fprintf */
#include <unistd.h> /* fork */
#include <stdlib.h> /* _exit */
#include <errno.h> /* errno */
#include <signal.h>

int main()
{
    pid_t writer;
    pid_t reader;

    writer = fork();
    if (writer == -1)
    {
        fprintf(stderr, "can't fork, error %d\n", errno);
        exit(1);
    }

    if (writer == 0)
    {
        printf("Writer process created.\n");
        reader = fork();
        if (reader == -1)
        {
            fprintf(stderr, "can't fork, error %d\n", errno);
            exit(1);
        }

        if (reader == 0)
        {
            printf("Reader process created.\n");
            kill(reader);
            printf("Reader was successfully murdered.\n");
        }
        kill(writer);
    }
    wait();
    printf("Writer killed.\n");
    return 0;
}
...