fork()-Frage



  • Hallo!

    Ich schreibe gerade ein Programm, dass Dateien bearbeiten soll.

    Die Dateinamen werden der Main-Funktion mittels Parameter übergeben.

    ./programmname Datei1.txt Datei2.txt

    Für jede Datei soll ein Prozess gestartet werden, welche die jeweilige Datei bearbeitet.

    MAIN-Funktion:

    pid=getpid();
    ppid=getppid();
    int i=1;

    while(i<argc)
    {
    i++;
    if(ppid)
    {
    pid=fork(); //nur der Vaterprozess soll Prozesse starten!
    }
    }

    switch(pid)
    {
    case 0: filename=argv[i]; //Datei wird geöffnet und bearbeitet
    break;
    default: //Vaterprozess

    }

    aber ich kann alle nicht Dateien öffnen, da 'i' in diesem fall immer 3 ist - d.h. es wird immer die zuletzt angegebene Datei geöffnet.

    Wie stelle ich das nun an, dass sämtlich angegebene Dateien korrekt geöffnet werden?

    Außerdem habe ich auch folgendes Problem:
    wenn ich nun mehrere parameter übergebe, zB

    ./programmname 1 2 3 4

    dann startet mein programm 8 prozesse, anstatt von 4 - warum???

    bin am verzweifeln!!

    mfg peter



  • Dieser Thread wurde von Moderator/in TactX aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Es ist logisch, dass i immer =3 ist!
    In jedem deiner Kind-Prozesse wird die while-Schleife solange durchlaufen, bis i=argc ist.
    Die switch()-Anweisung müsste direkt hinter dem fork() erfolgen, dann sollte es gehen.
    Der zweite Fehler ist, dass du der Variable ppid nur einmal am Anfang einen Wert zuweist. Dieser ist für alle Kindprozesse dann gleich!!!

    Lösung (ohne, dass ich es getestet habe):

    while (i < argc)
     {
      pid = fork();
      switch (pid)
       {
        case 0:  /* Kind-Prozess */
          [i]Datei öffnen usw.[/i]
          return(0);  /* Kind-Prozess beenden!!! */
        case -1:
          perror("Fehler bei fork()");
          return(-1);
        default:  /* Vater-Prozess */
          i++;
       }
     }
    

Anmelden zum Antworten