的C89標準規定:信號如何與序列點相互作用?
At sequence points volatile objects are stable in the sense that previous
evaluations are complete and subsequent evaluations have not yet occurred.
的C89標準還規定:
When the processing of the abstract machine is interrupted by receipt of a
signal, only the values of objects as of the previous sequence point may be
relied on.
這些要求離開我困惑,因爲我無法想象他們將如何 實際執行。我只對x86-64 彙編器有一個基本的瞭解,但這裏是我的腦海中所經歷的。假設我們有 一個易失結構,並且它有很多千字節。如果將現有的 結構複製到C中的此易失性結構中,那麼生成的機器代碼可能會非常大。現在,我們假設這個大量的機器代碼是 正在執行,並且系統上的某個shell在 進程上執行「kill」命令,導致某些信號升高。我的理解(或者更確切地說我的猜測是)該過程將在中間副本中被中斷,導致對易失性的要求被破壞,並且導致該結構從任何信號處理器的角度來看都是畸形的。
顯然事情並不像這樣,但他們實際上 是如何工作的?爲了論證,可以自由地假設該平臺是x86-64 或x86 Linux,Windows,OS X或其他一些常見的UNIX。
假設易失性結構設置爲在序列ponint A處將Alpha值賦值,然後賦值給在B處的值。現在讓我們假設一個信號處理程序在中間副本中在A和B之間觸發。該結構將主要來自Alpha的值,但它將部分地用來自Beta的值填充,因此不能依賴易失性結構的值*,因此明顯的實現不符合標準的要求。這仍然是我目前的理解。 –
@ patrick-rutkowski當您將其設置爲新值時,您不能依賴某件事物具有先前的值。這不是「依賴」的意思!這只是意味着你永遠不會看到之前的價值。這並不意味着後續操作不會改變該值。如果您無法在該商店之前看到結果,並且可以保證看到該商店的結果或其後發生的情況,則可以「依靠」商店操作。 –