Note that there are some explanatory texts on larger screens.

plurals
  1. POC pipe, fork, dup, and exec()
    text
    copied!<p>I'm trying to pass list of strings through pipe to child process where it should display through <code>/bin/cat</code> using <code>execl()</code>. I had it working earlier except that the pipe did not close so the program kept waiting. Don't know what I did and now it is not working at all. Can someone see my code and tell me what am I doing wrong that the <code>str</code> data is not being displayed by cat in child process?</p> <pre><code>int main(int argc, char** argv) { char *str[] = {"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"}; int fds[TOTAL_CHILDREN]; int writeFds; int catPID; int status; FILE * write_to_child; //create pipe if (pipe(fds) == -1) { perror("creating pipe: failed"); exit(EXIT_FAILURE); } pipe(fds); //create subprocess for cat child switch (catPID) { case 0: // successful creation of child close(fds[1]); //close write side from parents close(0); //close stdin dup(fds[0]); //connect pipe from execl cat to stdin execl("/bin/cat", "cat", (char *) 0); perror("exec failed!"); exit(20); break; case -1: //failure perror("fork failed: cat process"); exit(EXIT_FAILURE); default: //parent process close(fds[0]); writeFds = fds[1]; write_to_child = fdopen(fds[1], "w"); if (write_to_child == NULL) { perror("write to pipe failed"); exit(EXIT_FAILURE); } break; } int i; for (i = 0; i &lt; 9; i++){ fprintf(write_to_child, "%s\n", str[i]); } fclose(write_to_child); close(writeFds); wait(&amp;status); return (EXIT_SUCCESS); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload