每一個獨立的信號燈操作可能都需要維護一個調整動作。 Linux 至少為每一個進程
的每一個信號燈數組都維護一個 sem_undo 的數據結構。如果請求的進程沒有,就在需
要的時候為它創建一個。這個新的 sem_undo 數據結構同時在進程的 task_struct 數據
結構和信號燈隊列的 semid_ds 數據結構的隊列中排隊。對信號燈隊列中的信號燈執行
操作的時候,和這個操作值相抵消的值加到這個進程的 sem_undo 數據結構的調整隊列
這個信號燈的條目上。所以,如果操作值為 2 ,那麼這個就在這個信號燈的調整條目上
增加 -2 。
當進程被刪除,比如退出的時候, Linux 遍歷它的 sem_undo 數據結構組,並
實施對於信號燈數組的調整。如果刪除信號燈,它的 sem_undo 數據結構仍舊停留在進
程的 task_struct 隊列中,但是相應的信號燈數組標識符標記為無效。這種情況下,清除
信號燈的代碼只是簡單地廢棄這個 sem_undo 數據結構。