2016-11-02 2 views
1

Kernel: 3.12.30-AM335x-PD15.2.1 (von PHYTEC)ARM Embedded Linux (AM335x), Textdatei Inhalt gelöscht, nachdem Power Off

Meine Anwendung erfordert Bearbeiten einer Textdatei auf Laufzeit und die Verwendung dieser Inhalte Beim nächsten Mal wird es eingeschaltet. Also habe ich eine Textdatei erstellt, in der ich einen einfachen Text schreibe, "Disable" oder "Enable" mit dem Programm, das ich mit QT C++ geschrieben habe.

Was ich festgestellt habe, ist, nachdem das Programm schreibt den einfachen Text, wenn ich den Befehl "reboot" auf bash, und warten auf das Programm neu starten, bevor ich das System ausschalten (durch das Abstecken des Kabels), Der Befehl "cat TextFile.txt" gibt "Enable" oder "Disable" aus, je nachdem, was das Programm zuletzt korrekt geschrieben hat.

Wenn ich jedoch keinen Neustart und das System sofort ausschalten und dann wieder einschalten, bleibt die Textdatei, aber der Inhalt wird gelöscht, so dass "cat TextFile.txt" nichts ergibt.

Ich habe versucht, die gleiche manuell zu tun, die folgenden Methoden verwenden:

Methode 1:

echo Disable > TextFile.txt 
reboot 
.....wait for it to reboot 
cat TextFile.txt 

The results is "Disable". 

Methode 2:

echo Disable > TextFile.txt 
.. power off by plugging off the cable 
.. power on the system 
cat TextFile.txt 

No resulting text.. 

Ich möchte einfach nicht haben Starten Sie das System neu, um die Dateien zu speichern. Also würde ich mit der Ausführung von Befehlen in meinem QT C++ Programm zufrieden sein, um alles ohne Neustart zu speichern; aber ich kenne das Betriebssystem nicht sehr gut, daher weiß ich nicht, was ich tun soll, um das zu können.

Dies ist mein Code meines durch die Art und Weise:

QFile file(filename); 
    // Trying to open in WriteOnly and Text mode 
    if(!file.open(QFile::WriteOnly | 
        QFile::Text)) 
    { 
     qDebug() << " Could not open file for writing"; 
    } 

    // To write text, we use operator<<(), 
    // which is overloaded to take 
    // a QTextStream on the left 
    // and data types (including QString) on the right 

    QTextStream out(&file); 
    out << "Enable"; 
    file.flush(); 
    file.close(); 
+1

Das Ziehen des Steckers an einem Computer, was zu Datenverlust führt, sollte nicht überraschen. In Bezug auf die Verwendung von Linux ist der Neustart eine sehr teure Art, ['sync'] auszuführen (http://man7.org/linux/man-pages/man1/sync.1.html). – Notlikethat

Antwort

2

Als Ihr experiement auf der Schale ist dies nicht unbedingt, ein C++ oder Qt unabhängig von der Datei geschrieben wird sofort einfach nicht auf der Festplatte gezeigt hat.

Das System-Setup verwendet wahrscheinlich verzögertes Schreiben, um die Zugriffszeiten auf die Festplatte zu optimieren, d. H. Zuerst in In-Memory-Puffer schreiben und von Zeit zu Zeit auf die tatsächliche Festplatte schreiben.

Sie können das tun, wenn Sie andere Programme haben, die Dateien schreiben und Energieverlust als realistisches Szenario erwarten.

Nun, für das Qt-Programm in Frage, könnten Sie versuchen, QSaveFile anstelle von QFile verwenden, fragt die commit() das System tatsächlich auf Festplatte zu synchronisieren.

+0

Wie könnte ich es tunen? Ich brauche die Datei wirklich in höchstens 1 Minute gespeichert werden. Ich werde jetzt QSaveFile ausprobieren. – etugcey

+0

QSaveFile funktionierte ausgezeichnet, genau das, was ich brauchte, danke :) – etugcey

+0

für das Tuning: Das hängt von dem verwendeten Dateisystem ab: oft durch Mount-Optionen, aber einige erfordern möglicherweise, dass die Kernel-Build-Zeit eingestellt wird –