我在我的程序中有一個無限循環,它將寫入一個定義爲stdout的文件,直到我殺死它。因此,該文件將永遠不會被關閉,並且不會包含寫入的內容。殺死命令後關閉文件
有沒有辦法在kill命令後關閉文件?
我可以用信號,像
signal(SIGTERM, close(filename));
,但我會如何處理所有的終止信號?
我在我的程序中有一個無限循環,它將寫入一個定義爲stdout的文件,直到我殺死它。因此,該文件將永遠不會被關閉,並且不會包含寫入的內容。殺死命令後關閉文件
有沒有辦法在kill命令後關閉文件?
我可以用信號,像
signal(SIGTERM, close(filename));
,但我會如何處理所有的終止信號?
你的問題標記爲「LINUX」,所以除非你緩衝自己寫,不要刷新緩衝區(例如,使用fwrite
需要有時稱之爲fflush
時),內容將被寫入該文件,因爲它會在退出時正確關閉(即使出口受到信號強制)。你不需要fsync
,除非你正在做一些必須在機器崩潰後生存下來的東西(然後你需要知道你在做什麼才能使崩潰語義正確)。
既然你提到close
你想在信號處理程序中做什麼,它似乎並沒有緩衝你的寫入,所以你不需要做任何事情。成功調用write
後寫入的數據將在文件中結束,除非您的計算機崩潰(或者在沖洗緩衝區緩存之前您的磁盤/文件系統中斷,請不必擔心)。實際上,當你的程序返回write
時,數據可以被認爲寫入到文件中,並且可以被讀取該文件的其他進程看到(這是一個例外,如果機器崩潰或者幾個文件系統邊緣情況,但這是一個更復雜的話題)。
如果你在你的信號處理程序中所做的只是close
你的文件描述符和_exit
那麼你不需要信號處理程序。
我忘了提及該文件應該取代stdout。我編輯了我的問題。 – systemasis
@systemasis不會改變任何東西。從內核的角度來看,stdout只是一個數字,就像任何其他文件描述符一樣。如果你正在用'fwrite' /'printf' /'fprintf'或其他任何東西寫緩衝區,你有時需要調用'fflush',但這與關閉文件描述符無關。 – Art
剛剛在循環開始處添加了一個'fflush(stdout)',它完成了這個任務。謝謝。 對不起,@unwind,你說得對,我只是沒有把fflush放在正確的地方。 – systemasis
您可以強制刷新你對一些預定義的intervals.You迴路中的數據可以使用
int fsync(int fd);
或
int fdatasync(int fd);
FSYNC從內核緩衝區文件刷新到磁盤。除了元數據外,fdatasync也會這樣做。
這不保證所有數據在執行kill時都會被刷新。 –
'fsync' /'fdatasync'在這裏沒有關係。如果您希望機器崩潰的安全性,則「fsync」與使用有關,但它與進程寫入文件的數據無關。 – Art
嘗試在寫入('fflush(my_file);')後在循環中添加刷新。 – unwind
不要使用'signal',使用'sigaction',併爲*每個*可能的信號(從0到NSIG-1)設置一個動作。請注意,某些信號不能被捕獲爲'SIGKILL';所以當需要存儲關鍵數據時,您可能會考慮刷新緩衝區。 –
使用'signal(SIGTERM,close(filename))'不起作用?那是什麼功能?並在安裝信號處理程序時調用函數將立即「*關閉文件*」,而不是在信號觸發時進行。 –