Search code examples
c++pipefork

C++ I Want to write two strings into pipe with a small delay between


I want to send string "one" to the pipe then wait a second and send string "two" to the pipe. Afterwards it should get printed to the console. If I run the Program now it waits one second and then it prints both strings instead of print "one" wait a second and print the other one.

How can I achieve my goal=

Code:

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

Solution

  • This behaviour is caused by buffering. For more information: https://stackoverflow.com/a/23299046/4396133

    Use the fflush() to write data to stream immediately as shown in below code:

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