Home > Net >  How can i print every string in C pipes
How can i print every string in C pipes

Time:03-07

How can i print every string in C pipes i am stuck.

output like this

Received string: spike

Received string: spike

Received string: spike

but i want like this

Received string: spike

Received string: tom

Received string: jerry

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

int main(void)
{
    int fd[2], nbytes;
    pid_t childpid;
    char string[3][10] = {
        "spike",
        "tom",
        "jerry"};
    char readbuffer[80];

    pipe(fd);

    if ((childpid = fork()) == -1)
    {
        perror("fork");
        exit(1);
    }

    if (childpid == 0)
    {
        /* Child process closes up input side of pipe */
        close(fd[0]);

        /* Send "string" through the output side of pipe */
        write(fd[1], string, (strlen(string)   1));
        exit(0);
    }
    else
    {
        /* Parent process closes up output side of pipe */
        close(fd[1]);

        /* Read in a string from the pipe */
        nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
        for (int i = 0; i < 3; i  )
        {
            printf("Received string: %s \n", readbuffer);
        }
    }

    return (0);
}

CodePudding user response:

You've made several mistakes.

First of all, the child doesn't write the correct thing into the pipe. Then you read() a 80 byte buffer, which will contain all 3 strings (asuming you've fixed issue 1). But since you write one byte more than the string is long, you'll have a zero byte in the middle of your readbuffer. Any attempt to print that will simply stop at that zero byte.

It'll be important to add error handling. You can never ever assume that a read or write will be successful.

I've modified your code a little, such that it works better (but not right yet):

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

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        /* added newlines to separate the entries when printing */
        char    string[3][10] = {
                         "spike\n",
                         "tom\n",
                         "jerry\n"
                     };
        char    readbuffer[80];

        pipe(fd);
        
        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe */
                close(fd[0]);

                /* Send "string" through the output side of pipe */
                /* Added a loop here, so all 3 entries are written */
                for (int i = 0; i < 3;   i) {
                    write(fd[1], string[i], (strlen(string[i])));
                }
                exit(0);
        }
        else
        {
                /* Parent process closes up output side of pipe */
                close(fd[1]);

                /* Read in a string from the pipe */
                /* no loop needed here for now
                   But you'd need to read until you reach EOF.
                   I leave that as an exercise
                */
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                readbuffer[nbytes] = '\0';
                printf("Received string: %s \n", readbuffer);
        }
        
        return(0);
}
  • Related