Question

So I'm writing a program that involves the creation of 2 sets of pipes so that a parent process can write to a child process & the child process can right back...

I have the following code for my child process:

if(pid==0){  //child process
        cout << "executing child" << endl;
        close(fd1[WRITE_END]);
        close(fd2[READ_END]);
        if(dup2(fd1[READ_END],STDIN_FILENO) < 0 || dup2(fd2[WRITE_END],STDOUT_FILENO) < 0){
            cerr << "dup2 failed" << endl;
            exit(1);
        }
        cout << "test output" << endl;
        close(fd2[WRITE_END]);
        close(fd1[READ_END]);
        read(fd1[READ_END],buf,BUFFER_SIZE);
        cout << "Child process read " << buf << endl;
        execl("/bin/sort", "sort", "-nr", NULL);


    } else {  //... parent process

When I run my program, all I get as output from the child process is executing child but no test output. However, when I remove the if-statement handling the dup2 calls, my output does include test output.

Any ideas as to why dup2 causes my child process to not finish terminating?

(and by the way, originally, my two dup2's were done in separate if statements... when I put the test output below the dup2(fd1[READ_END],STDIN_FILENO) < 0 test, it outputs, but not when I put it below the other dup2 conditional test, so I'm convinced that that's where my issue is)

Thanks in advance

Was it helpful?

Solution

The call to dup2(fd2[WRITE_END],STDOUT_FILENO) connects STDOUT (which is used by C++ cout stream) to your fd2 pipe. So 'test output' gets written to the pipe.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top