89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
#include <fcntl.h>
|
|
#include <io.h>
|
|
#include <process.h>
|
|
|
|
static int handles[2] = { 0, 0 };
|
|
static int pid;
|
|
|
|
void create_pipe()
|
|
{
|
|
if( _pipe( (int *)&handles, 2048, _O_BINARY ) == -1 ) {
|
|
perror( "create_pipe" );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
}
|
|
|
|
void create_child( char *name )
|
|
{
|
|
char buff[10];
|
|
|
|
itoa( handles[0], buff, 10 );
|
|
pid = spawnl( P_NOWAIT, name,
|
|
"_pipe", buff, NULL );
|
|
close( handles[0] );
|
|
if( pid == -1 ) {
|
|
perror( "create_child" );
|
|
close( handles[1] );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
}
|
|
|
|
void fill_pipe()
|
|
{
|
|
int i;
|
|
int rc;
|
|
|
|
for( i = 1; i <= 10; i++ ) {
|
|
printf( "Child, what is 5 times %d\n", i );
|
|
rc = write( handles[1], &i, sizeof( int ) );
|
|
if( rc < sizeof( int ) ) {
|
|
perror( "fill_pipe" );
|
|
close( handles[1] );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
}
|
|
/* indicate that we are done */
|
|
i = -1;
|
|
write( handles[1], &i, sizeof( int ) );
|
|
close( handles[1] );
|
|
}
|
|
|
|
void empty_pipe( int in_pipe )
|
|
{
|
|
int i;
|
|
int amt;
|
|
|
|
for(;;) {
|
|
amt = read( in_pipe, &i, sizeof( int ) );
|
|
if( amt != sizeof( int ) || i == -1 )
|
|
break;
|
|
printf( "Parent, 5 times %d is %d\n", i, 5*i );
|
|
}
|
|
if( amt == -1 ) {
|
|
perror( "empty_pipe" );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
close( in_pipe );
|
|
}
|
|
|
|
void main( int argc, char *argv[] )
|
|
{
|
|
#if defined( __NT__ )
|
|
_fileinfo = 1;
|
|
#endif
|
|
|
|
if( argc <= 1 ) {
|
|
/* we are the spawning process */
|
|
create_pipe();
|
|
create_child( argv[0] );
|
|
fill_pipe();
|
|
} else {
|
|
/* we are the spawned process */
|
|
empty_pipe( atoi( argv[1] ) );
|
|
}
|
|
exit( EXIT_SUCCESS );
|
|
}
|