2014-07-26 34 views
5

的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。

回答

3

在序列點上,揮發性對象是穩定的,因爲之前的評估已完成且後續評估尚未發生。

這不會被違反,因爲中斷不是順序點。該規則僅描述「在順序點」發生的事情。如果我們序列點A之後與序列B點完成之前被中斷,我們不是「在」序列A點或序列B點

當抽象機的處理是由接收到的 中斷信號,只有以前的序列點的對象值可能是 所依賴的。

這不會被違反。如果我們在序列點A和B之間中斷,比如在中間複製中,可以依靠序列點A所做的所有更改。他們完成了。

能夠依靠先前的修改並不意味着您不會看到後續修改的任何影響。在將來的一些代碼可以修改它們之前,值是穩定的。

因此,明顯的實施並不違反任何一項要求。

+0

假設易失性結構設置爲在序列ponint A處將Alpha值賦值,然後賦值給在B處的值。現在讓我們假設一個信號處理程序在中間副本中在A和B之間觸發。該結構將主要來自Alpha的值,但它將部分地用來自Beta的值填充,因此不能依賴易失性結構的值*,因此明顯的實現不符合標準的要求。這仍然是我目前的理解。 –

+0

@ patrick-rutkowski當您將其設置爲新值時,您不能依賴某件事物具有先前的值。這不是「依賴」的意思!這只是意味着你永遠不會看到之前的價值。這並不意味着後續操作不會改變該值。如果您無法在該商店之前看到結果,並且可以保證看到該商店的結果或其後發生的情況,則可以「依靠」商店操作。 –