Ich brauche meinen Code (C++, auf Linux), um eine zweite ausführbare Datei aufzurufen, die zuvor eine Ausgabedatei geschrieben hat, die von dem zweiten Programm gelesen wird. Hat der naive Ansatz,Kann eine Datei sofort zum Lesen geöffnet werden, nachdem ofstream :: close() zurückgegeben wurde?
std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");
leiden an einer potentiellen Race-Bedingung, wo auch out.close obwohl() ausgeführt hat, kann die Datei nicht sofort von secondprogram
gelesen werden? Wenn ja, was ist die beste Vorgehensweise, um dies zu lösen?
Drei Noten:
- Wenn diese Datei-System-abhängig ist, bin ich im Verhalten auf ext3 und tmpfs interessiert.
- Offensichtlich gibt es andere Gründe (Dateiberechtigungen usw.), warum das zweite Programm die Datei möglicherweise nicht öffnen kann; Ich bin nur an dem Potenzial für eine Race-Bedingung interessiert.
- Der hardcoded Dateiname in dem obigen Beispiel dient der Einfachheit; in Wirklichkeit verwende ich
mkstemp
.
Ja, es ist garantiert. Sind Sie sicher, dass das Problem dabei ist? Hast du dein Programm "strace"? –
@BasileStarynkevitch Ich hatte (noch) kein Problem: Ich wollte nur überprüfen, dass ich keine Zukunft bekommen werde. Können Sie näher ausführen, ob es C++, Linux, das Dateisystem oder etwas anderes ist, das diese Garantie bietet? –
Ich würde sagen, alle von ihnen müssen Teile davon garantieren: Ihre C++ - Implementierung muss garantieren, dass der Puffer geleert wird und 'close()' nur zurückgibt, nachdem der relevante syscall zum 'Schließen' einer Datei zurückgegeben wurde, der Kernel muss garantieren, dass nach dem Zurücksenden des Syscalls die Datei geöffnet werden kann und alle über das alte Handle vorgenommenen Änderungen sichtbar sind und das VFS sicherstellen muss, dass die Caches korrekt verarbeitet werden.Ich stimme @BasileStarynkevitch zu: All dies sollte halten und Sie sollten keine Probleme haben. – us2012