we discussed how we can work with pipe() system call, where it is used(Linux shell), how to use pipes in threads(processes).
Here we can discuss on the topic ‘Number of readers and writers accessing a pipe’
A pipe can have more than one reader and more than one writer. Only one thing that must be kept in mind is that writer writes into fd[1] and reader reads from fd[0], where fd is the filedescriptor passed for the pipe() call.
int pipe(int fd[2]);
The program below demonstrates this with two writers and one reader. The writer Writer_ABC writes the capital Alphabet and the Writer_abc writes the small alphabet into the pipe. The reader reads in the order of the letters written by the two writers
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
int fd[2];//File descriptor for creating a pipe
//This function continously reads fd[0] for any input data byte
//If available, prints
void *reader()
{
while(1){
char ch;
int result;
result = read (fd[0],&ch,1);
if (result != 1) {
perror("read");
exit(3);
} printf ("Reader: %c\n", ch); }
}
//This function continously writes Capital Alphabet into fd[1]
//Waits if no more space is available
void *writer_ABC()
{
int result;
char ch='A';
while(1){
result = write (fd[1], &ch,1);
if (result != 1){
perror ("write");
exit (2);
}
printf ("Writer_ABC: %c\n", ch);
if(ch == 'Z')
ch = 'A'-1;
ch++;
}
}
//This function continously writes small Alphabet into fd[1]
//Waits if no more space is available
void *writer_abc()
{
int result; char ch='a';
while(1){
result = write (fd[1], &ch,1);
if (result != 1){
perror ("write");
exit (2);
}
printf ("Writer_abc: %c\n", ch);
if(ch == 'z')
ch = 'a'-1;
ch++;
}
}
int main()
{
pthread_t tid1,tid2,tid3;
int result;
result = pipe (fd);
if (result < 0){
perror("pipe ");
exit(1);
}
pthread_create(&tid1,NULL,reader,NULL);
pthread_create(&tid2,NULL,writer_ABC,NULL);
pthread_create(&tid3,NULL,writer_abc,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
}
Output
Writer_abc: o Writer_abc: p Writer_abc: q Writer_abc: r Writer_abc: s Writer_abc: t Writer_abc: u Reader: A Reader: B Reader: C Reader: D Reader: E Reader: F Reader: G Reader: H Reader: I Reader: J Reader: K Reader: L Reader: M Reader: N ...