2015-09-08 74 views
1

我主要使用strace來找出爲什麼進程似乎被吊死,並且它非常有效。但是現在我正在使用它來分析爲什麼某些鎖定在c程序中似乎不起作用。當我在實際的問題程序上運行它時,我看到每個進程都使用fcntl鎖定某個文件,並且該選項應該讓遲到進程等待上一個進程解鎖。 strace似乎表明,即使鎖定到位,每個進程也會繼續進行。strace「亂序」

但是,我製作了自己的c程序來分叉4個進程,如果進程是子進程,它將鎖定/tmp/test.txt,向其中添加幾行,然後解鎖文件。然後我用strace運行它,並且我看到按照我認爲不可能的順序排列的結果。再次,通過strace,每個進程似乎都通過fcntl鎖進行,即使另一個進程已經鎖定了它。另外,每個進程似乎在該進程完成解鎖後寫入文件。

流程運行過程中似乎存在某種程度的複雜性,我在查找文檔時遇到了問題。有人能幫助我走上正確的軌道嗎?

順便說一句,我已經檢查了使用的fcntl命令,它們似乎是非常標準的用法,並且每個參數都與文檔一起檢查。我使用的是Centos 6.6。

回答

0

憑什麼你說

每個進程似乎看透了,即使另一個進程已經是鎖定

有一個在strace的沒有選項以打印時間戳中的fcntl鎖進行cpu週期,以便您可以找到兩次系統調用之間的時間差異。

例如,

[PID 11778] 10:38:19.729429 < ...讀恢復> 「」,4096)= 0

[PID 11783] 10:38:19.729443寫(1, 「\ 33 [?1049h \ 33 [?1H \ 33 = \ r」,16>

在上面的輸出,時間標記是在該strace的打印輸出的時間而不是確切系統調用完成後立即進行,所以我們永遠無法說出第一個事件是發生在現實的早期還是晚期第二個事件。

+0

謝謝Nithan。我正在重新檢查strace中的時間。老腦電路慢慢醒來。 – Scott