Pipe.c
From Organic Design wiki
#include <errno.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #define BIG 4096000 int main(int argc, char **argv, char **envp ) { int pfds[2]; int status; char buffer[BIG]; int pid; int i,r,l; printf("Begin\n"); if(pipe(pfds) == -1) exit(errno); printf("pipe(): %d %d\n", pfds[0], pfds[1]); putenv("FOO=foo was set by the parent"); if((pid = fork()) == -1 ) { printf("fork(): failed\n"); exit(1); } else if(pid) { printf("fork() pid %d\n", pid); //parent close(pfds[1]); wait(&status); printf("wait() returned with status %d\n",status); while( i = read(pfds[0], &buffer, BIG ) ) { printf("read(): fetched %d bytes\n", i); printf("%s\n", buffer); } char *env; env = getenv("FOO"); printf("Parent: FOO=%s\n", env); } else { //child int fd = open("/dev/null", O_RDWR, 0); dup2(fd, 0); close(pfds[0]); dup2(pfds[1], 1); // set env putenv("FOO=foo was set by the child"); execl("hello.sh", "hello.sh" ); // should never get to here _Exit(0); } return 0; }