004
08.06.2005, 20:03 Uhr
Pler
Einer von Vielen (Operator)
|
Hab dieses Programm aus einem Buch: Das macht genau das, nur andersrum. Die Ausgabe aus dem Elternprozess, wird über eine Pipe auf die Eingabe des Kindprozesses gelegt. Der Kindprozess wird dann mit more überlagert.
( Dieses fehler_meld() ist nicht viel mehr als ein perror(), also nicht verwirren lassen )
C++: |
#include <math.h> #include <sys/wait.h> #include "eighdr.h"
int main(int argc, char *argv[]) { long von, bis, i, teiler, zahl, wurzel; int fd[2]; pid_t pid; FILE *schreib_dz;
if (argc != 3) fehler_meld(FATAL, "usage: %s von bis", argv[0]); else if ( (von = atol(argv[1])) <= 0 || (bis = atol(argv[2])) <= 0 ) fehler_meld(FATAL, "Argumente muessen positive Zahlen sein");
if (pipe(fd) < 0) fehler_meld(FATAL_SYS, "kann keine Pipe einrichten");
if ( (pid = fork()) < 0) fehler_meld(FATAL_SYS, "fork-Fehler");
else if (pid > 0) { /*------ Elternprozess: schreibt in die Pipe -----*/ close(fd[0]); /* Leseseite der Pipe schliessen */ if ( (schreib_dz = fdopen(fd[1], "w")) == NULL) fehler_meld(FATAL_SYS, "fdopen-Fehler");
for (i=von; i<=bis; i++) { /*-- Primfaktorzerlegung fuer von..bis */ teiler = 2; wurzel = sqrt(zahl=i); fprintf(schreib_dz, "%ld = ", zahl); while (teiler <= wurzel) { /* Faktoren zu einer Zahl */ while (zahl % teiler == 0) { fprintf(schreib_dz, "%ld * ", teiler); zahl /= teiler; } teiler++; } if (zahl != 1) fprintf(schreib_dz, "%ld\n", zahl); else fprintf(schreib_dz, "\b\b\b \n"); } fclose(schreib_dz); /* Schreibseite schliessen, um Kindprozess */ /* das Ende des Schreibens in Pipe mitzuteilen */ if (waitpid(pid, NULL, 0) < 0) fehler_meld(FATAL_SYS, "waitpid-Fehler"); exit(0);
} else { /*------ Kindprozess: liest aus der Pipe ---------*/ close(fd[1]); /* Schreibseite der Pipe schliessen */ if (fd[0] != STDIN_FILENO) { if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) fehler_meld(FATAL_SYS, "Fehler bei dup2 fuer stdin"); close(fd[0]); /* Nach dup2 wird fd[0] nicht mehr benoetigt */ }
if (execl("/bin/more", "more", NULL) < 0) fehler_meld(FATAL_SYS, "execl-Fehler fuer more"); } exit(0); }
|
Dieser Post wurde am 08.06.2005 um 22:43 Uhr von Pablo editiert. |