#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define BUFFER_SIZE 128
#define READ_END 0
#define WRITE_END 1
void createChildAndRead (int);
int main (int ac, char **av)
{
int processNumber;
if (ac == 2)
{
if (sscanf (av [1], "%d", &processNumber)== 1)
{
createChildAndRead(processNumber);
}
else fprintf(stderr, "Cannot translate argument\n");
}
else fprintf(stderr, "Invalid arguments\n");
return (0);
}
void createChildAndRead(int prcNum)
{
int fd[2];
int processCount;
char write_msg[BUFFER_SIZE];
char read_msg[BUFFER_SIZE];
if (pipe(fd) == -1){
fprintf(stderr, "Error in pipe");
}
if (prcNum == 1){
sprintf("Process %d starting\n", prcNum);
sleep(5);
sprintf("Process %d ending", prcNum);
}
else if (prcNum > 1){
processCount = fork();
}
if (processCount < 0){
fprtinf(stderr, "Error in fork");
}
if (processCount == 0) {
close(fd[WRITE_END]);
sprintf(read_msg, "Process %d starting", prcNum);
dup2(fd[READ_END], (prcNum+25));
close(fd[READ_END]);
sprintf(read_msg,"%d", prcNum-1);
close(fd[READ_END]);
}
else {
close(fd[READ_END]);
sprintf(write_msg, "Process %d starting", prcNum);
write(fd[WRITE_END], write_msg, sizeof(read_msg)+1);
close(fd[WRITE_END]);
}
}