2012-03-25 2 views
0

Programm läuft einmal und es wirft beide Daten in die Pipe und ruft es in der gleichen Bedingung aus, die sich gegenseitig ausschließen sollte (in if und sonst). Was ich hier nicht bekomme? Wie funktioniert das? Ich habe keine Erfahrung mit dieser Art der Programmierung.Pipe, fork, wie es möglich ist, dass das Programm ausgeführt wird, wenn und sonst die gleiche Bedingung

#include <sys/types.h> 
    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h> 

Lesen Sie die Zeichen aus der Pipe und echo sie auf stdout.

 void 
    read_from_pipe (int file) 
    { 
     FILE *stream; 
     int c; 
     stream = fdopen (file, "r"); 
     while ((c = fgetc (stream)) != EOF) 
     putchar (c); 
     fclose (stream); 
    } 

Schreiben Sie einen beliebigen Text in die Pipe.

 void 
    write_to_pipe (int file) 
    { 
     FILE *stream; 
     stream = fdopen (file, "w"); 
     fprintf (stream, "hello, world!\n"); 
     fprintf (stream, "goodbye, world!\n"); 
     fclose (stream); 
    } 

    int 
    main (void) 
    { 
     pid_t pid; 
     int mypipe[2]; 

     /* Create the pipe. */ 
     if (pipe (mypipe)) 
     { 
      fprintf (stderr, "Pipe failed.\n"); 
      return EXIT_FAILURE; 
     } 

     /* Create the child process. */ 
     pid = fork(); 
     if (pid == (pid_t) 0) 
     { 
      /* This is the child process. 
       Close other end first. */ 
      close (mypipe[1]); 
      read_from_pipe (mypipe[0]); 
      return EXIT_SUCCESS; 
     } 
     else if (pid < (pid_t) 0) 
     { 
      /* The fork failed. */ 
      fprintf (stderr, "Fork failed.\n"); 
      return EXIT_FAILURE; 
     } 
     else 
     { 
      /* This is the parent process. 
       Close other end first. */ 
      close (mypipe[0]); 
      write_to_pipe (mypipe[1]); 
      return EXIT_SUCCESS; 
     } 
    } 

Antwort

4

Gleich nach der Zeile, die sagt:

pid = fork(); 

Sie nicht mehr ein Programm haben, aber zwei verschiedene Einsen (wenn fork gelingt).

Es ist nicht das gleiche Programm, das beide ausführt. In dem unterordneten Prozess gibt fork 0 zurück, aber in dem Eltern gibt es die unterordnete PID zurück.

Das übergeordnete Element führt einen Zweig des if/else-Konstrukts aus, das untergeordnete Element ein anderes. (Und eine dritte wird ausgeführt, nur im Elternteil, wenn fork fehlschlägt.)

+0

Welcher Teil dieses Codes entscheidet, wie viele Programme ich zusammen laufen werde? reicht es, 'int mypipe [2];' zu 'int mypipe [3];' zu ändern, um 3 davon zu haben? – user1291641

+0

Nein, überhaupt nicht. 'pipe' erzeugt keine Prozesse,' fork' tut dies. Sie erhalten jedes Mal einen neuen Prozess, wenn Sie 'fork' aufrufen. Seien Sie vorsichtig damit und lesen Sie die Dokumentation - wenn Sie in einer Schleife "fork" nennen oder nicht darauf achten, welchen Code Sie in dem Kind vs im Elternteil ausführen, erhalten Sie möglicherweise eine "fork bomb". (Lesen Sie auch dazu.) – Mat

Verwandte Themen