Ausgabeumleitung in Datei funktioniert nicht mit srtg-c



  • Hallo,

    ich habe folgendes Problem. Wenn ich die stdout in eine Datei umlenke und und dann das programm mit strg-c beende, wird nichts in diese Datei geschrieben, wenn ich es normal auf ein return in main() laufen lasse aber schon.
    Wo ist da der Fehler, bzw. wie kann man das lösen?
    das eigtl. Programm ist größer, aber dass hier zeigt das Problem 🙂

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    int main()
    {
      close(1);
      open("test_file", O_WRONLY | O_CREAT | O_TRUNC);
      printf("Test\n");
    //  for ( ; ; )
    //  {}
      return 0;
    }
    

    Vielen Dank



  • die daten müssen erst mit close() oder flush() geschrieben werden. kann kein close in deinem code entdecken.
    Kurt.



  • Das hab ich auch schon probiert, aber wenn ich z.B. das Signal SIGINT abfange und da ein close(1) explizit mache hilft das auch nicht. außerdem dachte ich das bei beednigung eines Programms alle offenen deskriptoren automatisch geschlossen und puffer geleert werden?



  • die files werden nur bei beendigung nicht aber bei abbruch ( ^C ) geschlossen.
    Kurt.



  • kannst dir z.B. ne funktion schreiben, die immer öffnet, nen string schreibt und dann schliesst. ist z.B. für interne debug-logs gut, da so auch bei nem absturz das letztgeschriebene lesbar ist...



  • Die flush Funktion kann ich nicht finden, wo ist denn die definiert? fflush geht ja nicht. So wird doch eigtl. das Programm nicht abgebrochen sondern normal beendet, weil ich das Siganl abfange und exit aufrufe, oder?

    Ich wollte einfach alle ausgaben die evtl. von stdout komen sinnvoll unterbringen, weil es ein server-prozess werden soll.

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <signal.h>
    
    void handler(int signal)
    {
      close(1);
      exit(0);
    }
    
    int main()
    {
      signal(SIGINT, handler);
    
      close(1);
      open("test_file", O_WRONLY | O_CREAT | O_TRUNC);
      printf("Test\n");
    
      for ( ; ; )
      {}
    
      return 0;
    }
    


  • Ok, das Problem is gelöst. wenn ich das close(1) im signalhandler weglasse und nur exit aufrufe gehts.

    Kann mir jemand erklären warum ein dateiinhalt einer bereits geschlossenen datei gelöscht wird, wenn der kernel (oder wer auch immer) beim beenden ein zweites mal close aufruft?


Log in to reply