2012-04-04 16 views
0

Ich habe ein Programm, das eine Datei liest, behandeln Sie es und legen Sie die Ergebnisse in eine Ausgabedatei. Wenn ich ein Argument (Eingabedatei) habe, erstelle ich die Ausgabedatei und schreibe ihr den Inhalt.execl nicht von Kind

Ich habe einen fork() gemacht, um den stdout einen write() Inhalt umzuleiten.

char *program; 

program = malloc(80); 

sprintf(program, "./program < %s > %s", inputFile, outputFile); 
int st; 
switch (fork()) { 
    case -1: 
     error("fork error"); 
     case 0: 
      /* I close the stdout */ 
      close (1); 

      if ((fd = open(outputfile, O_WRONLY | O_CREAT , S_IWUSR | S_IRUSR | S_IRGRP)==-1)){ 

       error("error creating the file \n"); 
       exit(1); 
      } 

      execlp("./program", program, (char *)0); 

      error("Error executing program\n"); 
       default: 
      // parent process - waits for child's end and ends 
      wait(&st); 
      exit(0); 
    //***************** 

       } 

Das Kind wird erstellt, richtig mit dem <> stdin und stdout Dateien erstellt werden. Aber das Kind endet nie, und wenn ich den Vater töte, ist die Ausgabedatei leer, so dass der Code nicht ausgeführt wurde.

Was passiert? Danke!

+0

ich tun würde, dies mit 'open()' und 'dup2()' und 'exec()' anstatt zu versuchen, '<' and '>' für IO zu verwenden Umleitung. – Flexo

+0

Danke! Beide Lösungen haben funktioniert. – drules

Antwort

1

Die Funktionen in der Exec-Familie verstehen Umleitungen nicht.

Wie Sie execlp aufrufen, übergeben Sie ein Argument an Ihr Programm: ./program < %s > %s. Das ist richtig, ein Argument. Natürlich, execlp weiß nicht, was Umleitungen sind, und auch nicht program.

Ich würde ersetzen den gesamten Code mit:

char *program = malloc(LEN); 

snprintf(program, LEN, "./program < %s > %s", inputFile, outputFile); 
system(program); 
+0

Ich stimme Ihrer Diagnose zu, aber ich bin nicht auf die vorgeschlagene Lösung verkauft - dup2 scheint wie eine viel sauberere Art, dies zu tun. – Flexo

+0

@awoodland Warum sauberer? Die Weiterleitung an die Shell ist wahrscheinlich am einfachsten - dafür ist die Shell zuständig. Natürlich ist es nicht so effizient und nicht so tragbar, aber es besteht aus 3 Zeilen. – cnicutar

+0

Verschachtelungsmaterial tief in C fühlt sich schmutzig an. Abgesehen von dem nicht anmutigen Fehler mit funky Shells (ich würde lieber einen Kompilierzeitfehler als ein seltsames Laufzeitproblem haben, wenn es scheitern wird), ist es anfällig für böse Dinge, zum Beispiel wenn outputFile einen 'somepath; rm-rf ~ 'drin, oder schlimmer. – Flexo