user13713231
user13713231

Reputation:

C communicate parent and child to increase and print counter

I am trying to write a program so that the parent and child process can communicate back and forth between each other. The parent process and the child process ought to print the values from 1-100 where each process prints the value incrementing it by 1 each time. Now the issue I face is that, I know nothing much about pipes. What I gather from reading materials online is that I can use a pipe to read and write values. I have leveraged this to print something in the child process, and send back something to the parent. Now, I am not sure how to get the parent to return to the child after printing for itself? I know my code is probably all wrong, but I am really not sure what I should do.

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

int main(int argc, const char * argv[]) {
    int fd[2];
    if (pipe(fd)== -1){
        printf("An error occured while opening the pipe\n");
    }
    int id  = fork();
    int i = 0;
    if (id == 0){
        close(fd[0]);
        printf("In child: %d", i);
        i ++;
        write(fd[1], &i, sizeof(int));
        close(fd[1]);
    } else {
        wait(NULL);
        close(fd[1]);
        int y;
        read(fd[0],&y, sizeof(int));
        close(fd[0]);
       
    }
}

Upvotes: 0

Views: 119

Answers (1)

Tony Tannous
Tony Tannous

Reputation: 14876

To keep it simple, it's up to you to check return values and handle errors. This will only do it between 0 - 9 and you will have to expand the mathematics.

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

int main(int argc, char *argv[])
{
    int pipefd_1[2];
    int pipefd_2[2];   
    pid_t cpid;

    pipe(pipefd_1);
    pipe(pipefd_2);

    cpid = fork();

    if (cpid == 0) {    /* Child reads from pipe 1, writes to pipe 2*/
       char cval[] = {'0'};
       close(pipefd_1[1]);          /* Close unused write and read ends */
       close(pipefd_2[0]);
       
       while (atoi(cval) != 9) {
           read(pipefd_1[0], cval, 1);
         
           printf("Child print %d\n", atoi(cval));
           
           cval[0] += 1;
           write(pipefd_2[1], cval, 1);
       }


    } else {         
        char cval[] = {'0'};   /* Parent writes buf to pipe 1 */
        close(pipefd_1[0]);          /* Close unused read end */
        close(pipefd_2[1]);
        
        while (atoi(cval) != 9) {
             write(pipefd_1[1], cval, 1);
             read(pipefd_2[0], cval, 1);
             printf("Parent print %d\n", atoi(cval));
             cval[0] += 1;
        }
    }
}

Output

enter image description here

Upvotes: 1

Related Questions