This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/clibexam/_pipe.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 );
}