Fråga om hantering av filer i C och Linux/Windows.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Jan Almqvist »

Jag gissar på två möjligheter, antingen kommer programmet att strunta i att logga eller också kommer det att krascha.

Kanske något mer sannolikt med det första alternativet.

Om jag skriver ett program räknar jag inte med att någon annan ska pilla på filen om man inte bestämt så från början.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Inte jag heller men det kanske man borde göra. Jo förresten, i interaktiva program brukar jag berätta för användaren att det sket sig. I inbyggda system som det här bör man ju planera för det och hur man ska hantera felen. :D
Nerre
Inlägg: 26698
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Nerre »

Det vanligaste är väl att programmet faktiskt behåller filen låst så länge det körs? Då kommer programmet att varna/fel felmeddelande vid uppstart (och antagligen vägra starta med "Could not open log file, exiting!").

Gör man ett program som öppnar filen, skriver och sen stänger måste ju man ju inse att nåt annat program kan komma att pilla på filen (om nu inte programmet från början är gjort för nåt i stil med att logga till en skrivare).
Användarvisningsbild
swesysmgr
Inlägg: 14172
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av swesysmgr »

Men nu verkar det vara ett program som kan startas och stoppas av en användare lite hur som helst om jag förstår tråden rätt. Då är det en rätt märklig strategi att vänta sig att ett visst filnamn alltid skall vara tillgängligt, har du användare som kan peta med filsystemet då kommer de att radera eller öppna allt möjligt helt oförutsägbart.

Gör ett testprogram som öppnar loggfilen delat från Windows, accepterar loggskrivarprogrammet att öppna samma fil och lägga till rader då är problemet löst. Vill logg-generatorn låsa filen exklusivt då får packningsprogrammet göra motsvarande och testa att öppna filen exklusivt, blir svaret nej då vet det att loggeneratorn är igång, schemalägg en omstart av sig självt om 10 minuter. Om ja byt direkt namn på filen och fortsätt med att zippa/rara loggen under det nya namnet. Jag tror det blir ett väldigt kort race mellan öppna- och bytnamn raderna i koden men vill man ha 100% garanti för att inga loggdata går förlorade då måste nog ursprungsprogrammet ändras.

Allt ovan går att göra med script eller valfritt högnivåspråk under Windows, funktionen blir densamma som med C och Win32.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Jan Almqvist »

Nerre skrev:Det vanligaste är väl att programmet faktiskt behåller filen låst så länge det körs? Då kommer programmet att varna/fel felmeddelande vid uppstart (och antagligen vägra starta med "Could not open log file, exiting!").
Jag skulle tror precis tvärtom. Mina program körs ofta år efter år utan omstart. Det skulle vara väldigt opraktiskt om de låste några filer.
Nerre
Inlägg: 26698
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Nerre »

Varför då? Om inget annat program ska röra filerna så är det väl inget problem att filerna är låsta?

Men det handlar ju helt om miljö. Är det en liten burk som loggar nåt till ett minneskort är det ju inga problem att stänga filen mellan skrivningarna, det finns inget annat program i burken som kan öppna filen.

Men är det ett system där det kan startas andra processer parallellt så finns ju risken att en annan process låser filen, hur ska programmet lösa det? Slumpa fram ett nytt filnamn? Och om det också är låst? Fortsätta slumpa tills nåt verkar funka?
Användarvisningsbild
swesysmgr
Inlägg: 14172
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av swesysmgr »

Under Windows kan du be operativsystemet om ett garanterat unikt och fritt filnamn för t.ex. en tempfil och då får du det. Borde finnas något liknande även för andra OS.

Är det ditt eget program kör t.ex. med tidsstämplar på ms-nivå + slump och kolla om filnamnet är fritt annars vänta lite. Nej det är inte en teoretiskt 100% garanterad metod men har du säg max 100 instanser av programmet igång samtidigt på samma system då kommer det att fungera. Inte många rader kod extra det handlar om.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Jan Almqvist »

Nerre skrev:Varför då? Om inget annat program ska röra filerna så är det väl inget problem att filerna är låsta?
Inget annat program kanske men jag måste kunna röra filerna. Redigera, byta ut, vad som helst.
TtompaA
Inlägg: 125
Blev medlem: 27 januari 2014, 19:32:30
Ort: Älvängen

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av TtompaA »

Inte helt säker på att jag förstått frågeställningen till 100 %.
Men om du gör en kopia av loggfilen, gör dina konverteringar och sparar dessa till en tredje fil. Jämför därefter kontrollsumman mellan originalet och kopian för att säkerställa att ingen data tillkommit under konvertering och ta sedan bort kopian och originalet.
Då öppnar du aldrig originalfilen, du får reda på om något tillkommit under bearbetningen och du har full kontroll på allt som händer med alla inblandade filer.
Nerre
Inlägg: 26698
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Nerre »

Jan Almqvist skrev:Inget annat program kanske men jag måste kunna röra filerna. Redigera, byta ut, vad som helst.
Intressant. Hur gör du detta utan att använda något program till det?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Jag börjar inse att jag var lite otydlig när jag gav förutsättningarna. Här kommer ett försök till bättring.

Systemet är ett linuxbaserat övervakningssystem. Med största sannolikhet (om ingen får hjärnsläpp) kommer det aldrig att portas till något annat. Anledningen till att jag tog upp Windows var nyfikenhet.

Systemet loggar till ett SD-kort vid olika händelser som vi inte har någon kontroll över.
Ursprungligen var det tänkt att det skulle spara en fil per dygn, och det gjorde det. Sedan var det något, jag vet inte vad, som fick folk att tro att en stor fil skulle vara bättre. Nu inser de att det kan ta lång tid att tanka hem loggfilen via ssh. Mycket data efter ett år. :lol:

I princip skulle vi kunna övertyga den som har skrivit programmet att han ska ändra det. Men det skulle skapa mycket tandagnisslan och förmodligen nya fräscha buggar.

En kund har skrivit ett program som hämtar via ssh och sedan raderar filen. I mina ögon mindre bra.

Jag har skrivit ett script som byter namn på filen, väntar tio sekunder (borde räcka) och zippar filen i väntan på upphämtning. Fördelen med det är att data ligger kvar på SD-kortet tills man väljer att radera. Hängslen och livrem.

TtompaA: Problemet med det (tror jag) är att jag kanske tar bort filen när den precis har öppnats för skrivning. Men det kanske funkar. Vad händer om program A öppnar en fil för append, program B raderar den, program A stänger den? Jag vet inte. :humm:
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Mr Andersson »

TtompaA skrev:Inte helt säker på att jag förstått frågeställningen till 100 %.
Men om du gör en kopia av loggfilen, gör dina konverteringar och sparar dessa till en tredje fil. Jämför därefter kontrollsumman mellan originalet och kopian för att säkerställa att ingen data tillkommit under konvertering och ta sedan bort kopian och originalet.
Då öppnar du aldrig originalfilen, du får reda på om något tillkommit under bearbetningen och du har full kontroll på allt som händer med alla inblandade filer.
Hur får du en kontrollsumma av originalfilen utan att öppna den? Dessutom har du inga garantier att det inte skrivits någon data mellan att du verifierat originalet mot kopian och att originalet tas bort.
De enda userspace-metoderna jag kan komma på som ger 100% garanti att inte tappa data, om inte loggprogrammet har något eget API för att få ut datan, är att använda FUSE som nämnts tidigare (fungerar inte i windows) eller t.ex. LD_PRELOAD eller liknande .so/.dll-injektioner för att ersätta loggprogrammets I/O-funktioner med dina egna (där buggar i din I/O-kod kan krascha originalprogrammet).
TtompaA
Inlägg: 125
Blev medlem: 27 januari 2014, 19:32:30
Ort: Älvängen

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av TtompaA »

Inte vet jag, jag är ingen programmerare. :)
Man kanske kan kolla när filen senast sparades istället, fast det är väl på sekundnivå, kanske inte tillräckligt tillförlitligt.
Jämföra storleken? Originalprogrammet lägger väl bara till data? Tar inte bort något?

Om utvecklaren har möjlighet att göra ändringar kanske du kan be dem om ett tidsfönster varje timme eller dygn (beroende på hur ofta du vill konvertera data) då programmet garanterat inte skriver något under en stund. En gemensam config-fil med starttider och längd på fönstret kanske?
Eller att du kan skicka argument till programmet att den väntar med att skriva i x sekunder.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av sodjan »

> Varför då? Om inget annat program ska röra filerna så är det väl inget problem att filerna är låsta?

Varför ifrågasätta det, det framgår ju av frågeställningen att det *är* ett problem.

Man kanske helt enkelt vill kunna titta på loggen under det att programmet är igång,
inget konstigt med det. I våran miljö är det löst med att applikationen som loggar alltid
öppnar, skriver och stänger huvudloggen. Lite extra I/O, men loggen är normalt
tillgänglig för en TYPE.

> Intressant. Hur gör du detta utan att använda något program till det?

Det är väl en vanlig textfil? Eller, loggfiler brukar i alla fall ofta vara det... :-)
Vi, Notepad eller vad man nu har tillgängligt.

Jag skulle ändra programmet som loggar så att det stöder den hantering
som man vill ha av loggfilerna. Om man öppnar (med append), skriver
och stänger, så kan någon annan göra rename för att spara filen
samtidigt som det kommer att skapas en ny fil vid nästa skrivning.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Med 99% säkerhet öppnar och stänger loggprogrammet filen.

Och att ändra loggprogrammet vill vi inte. :)
Skriv svar