C ++ Хочу написать две строки в трубу с небольшой задержкой между - PullRequest
1 голос
/ 03 октября 2019

Я хочу отправить строку «один» в канал, затем подождать секунду и отправить строку «два» в канал. После этого он должен быть напечатан на консоли. Если я сейчас запускаю Программу, она ждет одну секунду, а затем печатает обе строки вместо того, чтобы печатать «одну», ждать секунду и печатать другую.

Как мне достичь своей цели =

Код:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

/* Read characters from the pipe and echo them to stdout. */

void
read_from_pipe (int file)
{
    FILE *stream;
    int c;
    stream = fdopen (file, "r");
    while ((c = fgetc (stream)) != EOF)
        putchar (c);
    fclose (stream);
}

/* Write some random text to the pipe. */

void
write_to_pipe (int file)
{
    FILE *stream;
    stream = fdopen (file, "w");
    fprintf (stream, "one\n");
    sleep(1);
    fprintf (stream, "two\n");
    fclose (stream);
}

int
main (void)
{
    pid_t pid;
    int mypipe[2];

    /* Create the pipe. */
    if (pipe (mypipe))
    {
        fprintf (stderr, "Pipe failed.\n");
        return EXIT_FAILURE;
    }

    /* Create the child process. */
    pid = fork ();
    if (pid == (pid_t) 0)
    {
        /* This is the child process.
           Close other end first. */
        close (mypipe[1]);
        read_from_pipe (mypipe[0]);
        return EXIT_SUCCESS;
    }
    else if (pid < (pid_t) 0)
    {
        /* The fork failed. */
        fprintf (stderr, "Fork failed.\n");
        return EXIT_FAILURE;
    }
    else
    {
        /* This is the parent process.
           Close other end first. */
        close (mypipe[0]);
        write_to_pipe (mypipe[1]);
        return EXIT_SUCCESS;
    }
}

1 Ответ

3 голосов
/ 03 октября 2019

Это поведение вызвано буферизацией. Для получения дополнительной информации: https://stackoverflow.com/a/23299046/4396133

Используйте fflush() для немедленной записи данных в поток, как показано в приведенном ниже коде:

void
write_to_pipe (int file)
{
    FILE *stream;
    stream = fdopen (file, "w");
    fprintf (stream, "one\n");
    fflush(stream);
    sleep(1);
    fprintf (stream, "two\n");
    fflush(stream);
    fclose (stream);
}
...