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;
}



