/*
Simple, simple pipe() sample.
Main program stdout -> child stdin -> chile stdout -> Main program stdout
cc spipe.c -o spipe
To run
>./spipe
any text
any text
^D
or
>./spipe < jim.txt
*/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int fd1[2]; /* stdin pipe Main->Child */
int fd2[2]; /* stdout Pipe Child->Main */
void oops(char *err, int exit_code)
{
fprintf(stderr, "%s\n", err);
exit(exit_code);
}
/*
Child process
*/
void p1(void)
{
int c;
/* Close pipe output */
close(fd1[1]);
/* Close stdin - 0, duplicate pipe input to 0 - it will new stdin */
if(-1 == dup2(fd1[0], 0))
oops("dup2 error 0", 100);
/* Close old descriptors */
close(fd1[0]);
/* Close pipe input*/
close(fd2[0]);
/* Close stdout - 1, duplicate pipe input to 1 - it will new stdout */
if(-1 == dup2(fd2[1], 1))
oops("dup2 error 1", 101);
/* Close old descriptors */
close(fd1[1]);
/* Then read from stdin and write to stdout */
write(1, "\n---Begin---\n", 13);
while(EOF != (c = getchar()))
write(1, &c, 1);
write(1, "\n---End---\n", 11);
exit(0);
}
main()
{
int c;
/* Creating pipe */
if(-1 == pipe(fd1))
oops("pipe error 1", 1);
if(-1 == pipe(fd2))
oops("pipe error 2", 2);
/* Split process */
if(fork()){ /* if fork() > 0 then parent */
/* Write parent stdin to child */
close(fd1[0]);
while(EOF != (c = getchar()))
write(fd1[1], &c, 1);
/* Close pipe descriptors */
close(fd1[1]);
/* Close pipe output */
close(fd2[1]);
/* Read child output and send it so stdout */
while(1 == read(fd2[0], &c, 1))
write(1, &c, 1);
close(fd2[0]);
wait(0);
}
else /* If fork() == 0 then child */
p1();
}
I am running this on UNIX solaris machine, Ideally, this program should output whatever I input to it. However, this is what happens:
$ ./spipe
saaddsad
^D
---Begin---
---End---
$
Any ideas? I should get saaddsad in the output.
Start Free Trial