The following program is designed to echo a message from one child process to another, with upper and lowercase letter reversed. The program reliably outputs just the message “h” and then quits. Explain in a very clearly why this is the output.Suggest how the program could be corrected to produce the expected output. #include #include #include #include #include #include int main() { int fd1[2]; int fd2[2]; char message[] = "Hello, world!\n"; char buffer[100]; pid_t pid1; pid_t pid2; if (pipe(fd1) == -1) { return 1; } if (pipe(fd2) == -1) { return 1; } pid1 = fork(); pid2 = fork(); if (pid1 < 0) { return 1; } if (pid2 < 0) { return 1; } if (pid1 > 0) { close(fd2[0]); write(fd2[1], message, strlen(message)+1); close(fd2[1]); close(fd1[1]); read(fd1[0], buffer, 100); close(fd1[0]); printf("%s", buffer); } else if (pid2 > 0) { close(fd2[1]); read(fd2[0], buffer, 100); close(fd2[0]); close(fd1[0]); for (int i=0; i
The following
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
int main()
{
int fd1[2];
int fd2[2];
char message[] = "Hello, world!\n";
char buffer[100];
pid_t pid1;
pid_t pid2;
if (pipe(fd1) == -1)
{ return 1;
}
if (pipe(fd2) == -1)
{ return 1;
}
pid1 = fork();
pid2 = fork();
if (pid1 < 0)
{ return 1;
}
if (pid2 < 0)
{ return 1;
}
if (pid1 > 0)
{
close(fd2[0]);
write(fd2[1], message, strlen(message)+1);
close(fd2[1]);
close(fd1[1]);
read(fd1[0], buffer, 100);
close(fd1[0]);
printf("%s", buffer);
}
else if (pid2 > 0) {
close(fd2[1]);
read(fd2[0], buffer, 100);
close(fd2[0]);
close(fd1[0]);
for (int i=0; i<strlen(buffer)+1; i++) {
if(islower(buffer[i])) {
buffer[i] = toupper(buffer[i]);
}
else {
buffer[i] = tolower(buffer[i]);
}
sleep(1);
write(fd1[1], &buffer[i], 1);
}
close(fd1[1]);
}
return 0;
}
Trending now
This is a popular solution!
Step by step
Solved in 2 steps with 5 images