An example using pipes to communicate between
processes
/********************************************
* CSCI 4630 *
* *
* This program demonstrates a producer and *
* consumer that communicate via a pipe. *
********************************************/
#include
#include
#include
/*******************************************
* producer *
*******************************************
* Write information into the pipe whose *
* write-end is given by pipe_write_end. *
*******************************************/
void producer(FILE *pipe_write_end)
{
int i;
for(i = 1; i <= 100; i++) {
fprintf(pipe_write_end, "%d ", i);
}
fclose(pipe_write_end);
exit(0);
}
/*******************************************
* consumer *
*******************************************
* Read information from the pipe whose *
* read-end is given by pipe_read_end, *
* and copy it to the standard output. *
*******************************************/
void consumer(FILE *pipe_read_end)
{
int n,k;
while(1) {
int n = fscanf(pipe_read_end, "%d", &k);
if(n == 1) printf("consumer: got %d\n", k);
else break;
}
fclose(pipe_read_end);
exit(0);
}
/*******************************************
* main *
*******************************************
* Build the producer and consumer and *
* wait for them to finish. *
*******************************************/
int main()
{
pid_t producer_id, consumer_id;
int pd[2];
FILE *pipe_write_end, *pipe_read_end;
/*-----------------*
* Build the pipe. *
*-----------------*/
pipe(pd);
pipe_read_end = fdopen(pd[0], "r");
pipe_write_end = fdopen(pd[1], "w");
/*--------------------*
* Fork the producer. *
*--------------------*/
producer_id = fork();
if(producer_id == 0) {
fclose(pipe_read_end);
producer(pipe_write_end);
}
/*--------------------*
* Fork the consumer. *
*--------------------*/
consumer_id = fork();
if(consumer_id == 0) {
fclose(pipe_write_end);
consumer(pipe_read_end);
}
/*--------------------------*
* Wait for both to finish. *
*--------------------------*/
fclose(pipe_read_end);
fclose(pipe_write_end);
wait(NULL);
wait(NULL);
return 0;
}