C pipe, fork, dup, and exec()
14,547
You probably want to add the line
catPID = fork();
and I'm not sure why you've got pipe(fds)
twice
Author by
codeBarer
Updated on June 04, 2022Comments
-
codeBarer almost 2 years
I'm trying to pass list of strings through pipe to child process where it should display through
/bin/cat
usingexecl()
. 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 thestr
data is not being displayed by cat in child process?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 < 9; i++){ fprintf(write_to_child, "%s\n", str[i]); } fclose(write_to_child); close(writeFds); wait(&status); return (EXIT_SUCCESS); }