Linux, C-programmering. Hur testa att en fil är färdigskriven?

Permalänk
Medlem

Linux, C-programmering. Hur testa att en fil är färdigskriven?

Har ett litet problem. Ett program ligger och snurrar i en raspberry pi och ibland skriver en liten fil till en RAM-disk. RAM-disken är en plats för utbyte mellan flera program. Kan tyckas lite "knöligt" men processerna är långsamma och filhantering är ganska rakt-på och väl känd.
Nu till problemet. Konsumerande program ligger och väntar på att en fil med ett visst namn ska skrivas/skapas. Jag använder då access() i en loop. Sen måste jag ta till delay_ms() efter att access() hittat filen för att vänta lite innan jag läser. Men tycker detta "vänta xx ms" känns okontrollerat. Finns det en metod att kolla att filen är färdigskriven och stängd av skrivande program?
Tacksam för input.

PS/
Kollade på några exempel på datautbyte via minnet men bävade för exemplen och hade dessutom inte tid att prova och testa. Jag fick lov att gå på en snabbare, känd lösning.

Permalänk
Medlem

Tror du kan använda inotify (se man inotify). Event IN_CLOSE_WRITE ser ut att göra det du vill.

Permalänk
Medlem
Skrivet av GoldenBeard:

Tror du kan använda inotify (se man inotify). Event IN_CLOSE_WRITE ser ut att göra det du vill.

Du...den där var användbar. Ser ut att kunna fungera i en sån där indexeringstjänst som plockar ut nyckelord i en skapad/ändrad fil.
Ska skriva ett testprogram. Tack!

Permalänk
Medlem
Skrivet av GoldenBeard:

Tror du kan använda inotify (se man inotify). Event IN_CLOSE_WRITE ser ut att göra det du vill.

Har testat inotify och det gör det den ska. Implementeringen är väl lite bökig men så kom jag på att jag kan göra en fseek. Rapporterar filesize() tillbaka -1 alt 2 så innebär det att filen ej finns alt har skapats men inte innehåller nåt. Ger filsize() tillbaka nåt >4 då vet jag att den innehåller information som jag kan läsa. (En siffra på rad ett och ett kort ord på rad två). Har testat och det funkar där jag ska använda det. Det gör säkert inotify också men pga tidsbrist så får jag köra filesize().

Permalänk
Medlem

An annan metod är att du skriver till en fil med ett annat namn . När filen är färdigskriven så gör skrivande program "rename" till filnamnet som läsande program vill läsa. Då finns ingen risk att filen inte är klar.

Permalänk
Medlem
Skrivet av Irre:

An annan metod är att du skriver till en fil med ett annat namn . När filen är färdigskriven så gör skrivande program "rename" till filnamnet som läsande program vill läsa. Då finns ingen risk att filen inte är klar.

Det var riktigt smart. Det finns en skönhet i enkelhet.

Skickades från m.sweclockers.com

Permalänk
Medlem

Om man vill förhindra att flera trådar eller processer använder samma resurs så är ju nog semafor/mutex den rätta lösningen.

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.