OpenVMS Source-Code Demos

PIPE_DEMO_ORIGINAL.C

//
// parent.c
// ========
// http://h71000.www7.hp.com/doc/732final/5763/5763pro_026.html
//
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int decc$set_child_standard_streams(int, int, int);

main()
{
    int fdin[2], fdout[2], fderr[2];
    char msg[] = "parent writing to child's stdin";
    char buf[80];
    int nbytes;

    pipe(fdin);
    pipe(fdout);
    pipe(fderr);

    if ( vfork() == 0 ) {
	decc$set_child_standard_streams(fdin[0], fdout[1], fderr[1]);
	execl( "child", "child" );
    }
    else {
	write(fdin[1], msg, sizeof(msg));
	nbytes = read(fdout[0], buf, sizeof(buf));
	buf[nbytes] = '\0';
	puts(buf);
	nbytes = read(fderr[0], buf, sizeof(buf));
	buf[nbytes] = '\0';
	puts(buf);
    }
}

//
// child.c
// =======
//

#include <stdio.h>
#include <unistd.h>

main()
{
    char msg[] = "child writing to stderr";
    char buf[80];
    int nbytes;

    nbytes = read(0, buf, sizeof(buf));
    write(1, buf, nbytes);
    write(2, msg, sizeof(msg));
}

$!
$! child.com
$! =========
$!
$ read sys$command s
$ write sys$output s
$ write sys$error "child writing to stderr"

Notes:

This example program returns the following for both child.c and child.com :

sample run
==========
$ run parent
parent writing to child's stdin
child writing to stderr