Anzeige:
Ergebnis 1 bis 5 von 5

Thema: offene fd's in prozessen ?

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749

    offene fd's in prozessen ?

    Hallo ich habe ein Verständnisproblem:

    wenn ich ein file öffne und danach einen neuen prozess forke...

    und in diesem kindprozess dann auf den dateideskriptor zugreife .....

    müsste das nicht fehlschlagen ? Aber mit folgendem code:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    extern char **environ;
    
    int main(int argc, char **argv)
    {
             pid_t child1;
             FILE *file;
             file = fopen("file.txt","r");
             int fd;
    
             while(1)
             {
                    switch(child1=fork())
                    {
                         case -1 :  printf("Error at fork()..........\n");  exit(0);
                          case 0 :  printf("\nCHILD PROCESS\n");
                                    fd = fileno(file);
                                    printf("This is the access try to the file deskriptorbefore invoking fork():->%d",fd);
                                    exit(1);
                          default : printf("\nPARENT PROCESS\n");
    
                                    exit(2);
                    }
            }
            return 0;
    }
    kann ich locker auf den fd zugreifen?

    Warum ?
    Ich dachte mit dem neuen Prozess wird der gesamte stackinhalt vom urspurungsprozess durch den kindprozess überschrieben ... ?

  2. #2
    Registrierter Benutzer
    Registriert seit
    04.05.2005
    Ort
    Dortmund
    Beiträge
    31
    Beim 'forken' wird eine 1 zu 1 Kopie vom Vaterprozess erzeugt. Der Unterschied bei beiden Prozessen ist nur die PID und die PPID. Dementsprechend bekommt das Kind auch die Deskriptoren - das denke ich mir jetzt zumindest Habe bisher vor dem Funktionsaufruf immer alle FDs geschlossen...

    Mfg, Lord Kefir

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    ist es nicht sogar so, dass der geforkte prozess seine eigenen fd's hat? (sobald er darauf zugreift werden die glaub ich sogar dupliziert)

    greetz

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hi,

    der geforkte Prozess erbt alle Filedescriptoren des Vaterprozesses. Allerdings als echte Kopie. Veränderungen an diesen Deskriptoren wirken sich also nicht mehr auf die Deskriptoren im Vaterprozess aus und umgekehrt.
    Möchte man einen Deskriptor beim forken nicht vererben, so gibt man ihm die Eigenschaft FD_CLOEXEC:

    Code:
    fcntl(my_fd, F_SETFD, FD_CLOEXEC);
    Damit wird dieser spezielle Filedeskriptor beim Aufruf von fork nicht vererbt, sondern für den Kindprozess geschlossen, also nicht mehr verfügbar. Der Vaterprozess behält diesen Deskriptor ganz normal weiter.

    Gruß

    almoeli

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Die Eigenschaft wird auch gerne genutz um die Kommunikation mit dem Child zu ermöglichen:
    1. anonyme pipe erzeugen
    2. fork()
    3. Parent schliesst ein Ende der Pipe
    4. Child schliesst das andere Ende der Pipe
    5. Nun können beide über die Pipe kommunizieren


    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •