#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int
main( int argc, char **argv)
{
int pfds[ 2], i;
size_t pbytrd;
pid_t childpid;
char buffer[ 200];
pipe( pfds);
if( ( childpid = fork() ) == -1)
{
perror( "fork error: ");
exit( 1);
}
else if( childpid == 0)
{
close( pfds[ 0]);
dup2( pfds[1], 1);
close( pfds[ 1]);
for( i = 0; i < 10; i++)
printf("Hello...");
execlp( "xterm","xterm","-e","./sample_a", (char *) 0);
exit( 0);
}
else
{
close( pfds[ 1]);
for( ; ; )
{
if( ( pbytrd = read( pfds[ 0], buffer, sizeof( buffer) ) ) == -1)
{
perror(" read error: ");
exit( 1);
}
else if( pbytrd == 0)
{
write( fileno( stdout), "Cannot read from pipe...\n", strlen( "Cannot read from pipe...\n") );
exit( 0);
}
else
{
write( fileno( stdout), "MESSAGE: ", strlen( "MESSAGE: ") );
write( fileno( stdout), buffer, pbytrd);
}
}
}
return( 0);
}
My sample_a.c code is below:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int
main( int argc, char **argv)
{
int i;
for( i= 0; i< 10; i++)
write( fileno( stdout), "Hello...", strlen( "Hello...") );
return( 0);
}
In the above code, what I really want to do is: 1) Redirect output from the child process to pipe and have parent read from the pipe and print it out to stdout.
I am able to redirect child process output( "printf") from stdout to the pipe but I am not able to redirect execlp's child process, xterm, output to the pipe.
Can anybody help me this?
xtermis a terminal emulator. It executes the program you provided (sample_a), connecting its input and outputs to itself, so that the program receives the user input in its standard input, and prints to the user whatever the it sends to its standard and error outputs.What your program is doing is to connect the
xtermoutput to the pipe, and trying to read that. Butxtermis a GUI program, it does not normally write data to its outputs. Perhaps it is not really clear what exactly you are trying to achieve.If you remove the
xtermpart, it should work as you expect, that is, the parent process will see whatsample_awrites to the output.