70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
|
/**
|
||
|
* 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;
|
||
|
}
|