I ran into a problem with this C exercise. The task is to create two processes. The two are connected with two pipes that terminate in the stdin and stdout of the child. The child process is then replaced with bc. I am then supposed to write a term (e.g. 1 + 2) from the parent to the child process (bc).
The pipes are doing what they're supposed to do, however, bc doesn't seem to like the input. When I write into the pipe, bc responds with multiple lines of the following:
(standard_in) 1: illegal character: ^@
This is my solution so far:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
/*Create two pipes:
One from parent to child (pipe_pc)
and one from child to parent (pipe_cp).
*/
int pipe_pc[2], pipe_cp[2];
int cid;
if (pipe(pipe_pc) == -1 || pipe(pipe_cp) == -1) {
printf("Could not pipe\n");
exit(EXIT_FAILURE);
}
// Create child process
cid = fork();
if (cid == -1) {
printf("Could not fork.\n");
exit(EXIT_FAILURE);
}
// Child process
if (cid == 0) {
// Redirect pipes
close(STDOUT_FILENO);
close(STDIN_FILENO);
close(pipe_pc[1]); // Close writing end
close(pipe_cp[0]); // Close reading end
dup2(pipe_pc[0], STDIN_FILENO); // Take stdin from parent
dup2(pipe_cp[1], STDOUT_FILENO); // Give stdout to parent
int err;
// Replace child with bc
err = execl("/usr/bin/bc", "bc --quiet", (char*) NULL);
printf("%s %d\n", "Could not start bc:", err);
exit(err);
}
// Parent Process
else {
char input[128] = "";
char buffer[128] = "";
printf("%s\n", "Parent process running");
// Copy argv to a single string
for(int i=1; i < argc; i++) {
strcat(input, argv[i]);
}
// Write the input to the child's stdin
write(pipe_pc[1], input, sizeof(input);
// Read the child's stdout
read(pipe_cp[0], buffer, sizeof(buffer));
printf("Result: %s\n", buffer);
return 0;
}
}
Hints and help are greatly appreciated, thanks in advance!