c-uebungen/Assignment_027/solution/pipe_rechner.c

70 lines
1.6 KiB
C
Raw Normal View History

2023-05-21 21:10:46 +02:00
/**
* Rechner mit Pipes.
*
* Schreiben Sie ein Programm, das über `fork` zwei Prozesse erzeugt,
* die über zwei Pipes miteinander verbunden sind. Die beiden Pipes
* dienen der bidirektionalen Kommunikation zwischen den beiden
* Prozessen.
*
* Der Elternprozess sendet zwei Integer-Werte über die Pipe und der
* Kindprozess berechnet die Summe der beiden Zahlen und sendet
* das Ergebnis an den Elternprozess zurück. Dieser empfängt das
* Ergebnis und gibt es auf der Konsole aus.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void write_num(int fd, int num) {
write(fd, &num, sizeof(num));
}
int read_num(int fd) {
int num;
read(fd, &num, sizeof(num));
return num;
}
int main(int argc, char** argv) {
int pipefd_a[2];
int pipefd_b[2];
// zwei Pipes anlegen
if (pipe(pipefd_a) == -1 || pipe(pipefd_b) == -1) {
perror("Keine Pipe");
exit(1);
}
// Variablen mit besseren Namen
int pc_r = pipefd_a[0];
int pc_w = pipefd_a[1];
int cp_r = pipefd_b[0];
int cp_w = pipefd_b[1];
if (fork() > 0) {
// parent
close(pc_r);
close(cp_w);
write_num(pc_w, 42);
write_num(pc_w, 23);
int result = read_num(cp_r);
printf("Ergebnis: %d\n", result);
close(pc_w);
close(cp_r);
}
else {
// child
close(pc_w);
close(cp_r);
int a = read_num(pc_r);
int b = read_num(pc_r);
int a_b = a + b;
write_num(cp_w, a_b);
close(cp_w);
close(pc_r);
}
return 0;
}