This is an example using fork() and pipe() to demonstrate communication from a parent process to a child process.
There some details worth noticing:
#include <sys/wait.h> /* Needed to use wait() */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* UNIX and POSIX constants and functions (fork, pipe) */ #include <string.h> /* Needed to use strlen() */ int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Usage: %s\n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) /* An error has occurred. */ { fprintf(stderr, "%s", "The call to pipe() has failed.\n"); exit(EXIT_FAILURE); } cpid = fork(); /* fork() returns the child process's PID */ if (cpid == -1) /* An error has occurred. */ { fprintf(stderr, "%s", "The call to fork() has failed.\n"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Child reads from pipe */ printf("I am the child.\n"); close(pipefd[1]); /* Close unused write end */ printf("The child is about to read from the pipe.\n"); while (read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); printf("The child has just echoed from the pipe to standard output.\n"); _exit(EXIT_SUCCESS); } else { /* Parent writes argv[1] to pipe */ printf("I am the parent.\n"); close(pipefd[0]); /* Close unused read end */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Closing creates the EOF marker. */ printf("The parent has just written data into the pipe.\n"); printf("The parent will now wait for the child to terminate.\n"); wait(NULL); /* Parent waits for the child to terminate */ exit(EXIT_SUCCESS); } return 0; }