Zuhriddin Musabayev
Zuhriddin Musabayev

Reputation: 51

Communication between parent and child process using pipe in c++

I wanted to do this problem but I cannot take input message:

Create a program that does the following:

1.Create a parent and a child process

2.The parent process reads a number from keyboard and sends it to the child

3.The child calculates if the given number is prime or not and prints the result on screen

This is my code:

#include <iostream>
#include <unistd.h>      // for fork()
#include <string.h>      // for strerror()
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

bool isprime(int number);

int main() 
{
    int num;
    pid_t pid;
    int fd[2];
    char buffer[100];
    pipe(fd);

    pid = fork();
    
    //parent process
    if (pid > 0)
    {
        cin>>num;
        write(fd[1], &num, sizeof(num));
        close(fd[1]);
        int status;
        //Do not check for errors here
        wait(&status);
    }
    //child process
    else if (pid == 0)
    {
        read(fd[0], buffer, 100);
        close(fd[0]);
        if (isprime(num))
        {
            cout<<"number is prime";
        }
        else
        {
            cout<<"number is not prime";
        }
        return EXIT_SUCCESS;
    }
    
    else
    {
        cout << "fork() failed (" << strerror(errno) << ")" << endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;

}
bool isprime(int number)
{
    if (number < 2)
        return false;

    if (number == 2)
        return true;

    for (int i = 2; (i*i) <= number; i++)
    {
        // Take the rest of the division
        if ((number % i) == 0)
            return false;
    }

    return true;
}

this my result of run

Upvotes: 3

Views: 1775

Answers (1)

Serge Ballesta
Serge Ballesta

Reputation: 148975

Using a pipe along with fork is not that hard, but you must respect some rules:

  • each part should close the handle that it does not use. Not doing it is a key for future problems
  • starting from the fork, changes in one process are not reflected in the other one

Your code should become:

...
//parent process
if (pid > 0)
{
    close(fd[0]);   // close the part that only the other process will use
    cin>>num;
    write(fd[1], &num, sizeof(num));
    close(fd[1]);
    int status;
    //Do not check for errors here
    wait(&status);
}
//child process
else if (pid == 0)
{
    close(fd[1]);     // close the part used by the other process
    read(fd[0], &num, sizeof(num)); // read into num what the parent has written
    close(fd[0]);
    ...

In real world code, you should check that every read is successfull (both from cin and from the pipe...)

Upvotes: 2

Related Questions