linux中的SEM_UNDO

當操做信號量(semop)時,sem_flg能夠設置SEM_UNDO標識;SEM_UNDO用於將修改的信號量值在進程正常退出(調用exit退出或main執行完)或異常退出(如段異常、除0異常、收到KILL信號等)時歸還給信號量。
如信號量初始值是20,進程以SEM_UNDO方式操做信號量減2,減5,加1;在進程未退出時,信號量變成20-2-5+1=14;在進程退出時,將修改的值歸還給信號量,信號量變成14+2+5-1=20。ide

I.SEM_UNDO示例url

i.創建包含兩個信號量的信號量集,第一個信號量置20,第二個信號量置10spa

[plain] view plain copy.net

  1. [redhat@localhost sem]$ ipcmk -S 2  orm

  2. Semaphore id: 131075  blog

  3. [redhat@localhost sem]$ ./seminfo  進程

  4. command : ./seminfo semid  ip

  5. [redhat@localhost sem]$ ./seminfo 131075  get

  6. key:585c7c37  it

  7. semid:131075  

  8. nsems:2  

  9. -------sem details---------  

  10. semnum:0, semval:0  

  11. semnum:1, semval:0  

  12. [redhat@localhost sem]$ ./semop  

  13. command : ./semop semid semnum semops undo[0|1] sleeps[0-15]  

  14. [redhat@localhost sem]$ ./semop 131075 0 20 0 0  

  15. [redhat@localhost sem]$ ./semop 131075 1 10 0 0  

  16. [redhat@localhost sem]$ ./seminfo 131075  

  17. key:585c7c37  

  18. semid:131075  

  19. nsems:2  

  20. -------sem details---------  

  21. semnum:0, semval:20  

  22. semnum:1, semval:10  



ii.不設置SEM_UNDO,將第一個信號量減2;進程未退出時,信號量由20變成18;進程正常退出時,保持18不變。
設置SEM_UNDO,將第二個信號量減2;進程未退出時,信號量由10變成8;進程正常退出時,將2歸還給信號量,信號量從新變回10

[plain] view plain copy

  1. [redhat@localhost sem]$ ./semop 131075 0 -2 0 0  

  2. [redhat@localhost sem]$ ./semop 131075 1 -2 1 15 &  

  3. [1] 3339  

  4. [redhat@localhost sem]$ ./seminfo 131075  

  5. key:585c7c37  

  6. semid:131075  

  7. nsems:2  

  8. -------sem details---------  

  9. semnum:0, semval:18  

  10. semnum:1, semval:8  

  11. [redhat@localhost sem]$ ./seminfo 131075  

  12. key:585c7c37  

  13. semid:131075  

  14. nsems:2  

  15. -------sem details---------  

  16. semnum:0, semval:18  

  17. semnum:1, semval:8  

  18. [redhat@localhost sem]$ ./seminfo 131075  

  19. key:585c7c37  

  20. semid:131075  

  21. nsems:2  

  22. -------sem details---------  

  23. semnum:0, semval:18  

  24. semnum:1, semval:10  

  25. [1]+  Done                    ./semop 131075 1 -2 1 15  



iii.不設置SEM_UNDO,將第一個信號量減2;進程未退出時,信號量由18變成16;進程非正常退出時,保持16不變。
設置SEM_UNDO,將第二個信號量減2;進程未退出時,信號量由10變成8;進程非正常退出時,將2歸還給信號量,信號量從新變回10

[plain] view plain copy

  1. [redhat@localhost sem]$ ./semop 131075 0 -2 0 10 & ./semop 131075 1 -2 1 15&  

  2. [1] 3352  

  3. [2] 3353  

  4. [redhat@localhost sem]$ ./seminfo 131075  

  5. key:585c7c37  

  6. semid:131075  

  7. nsems:2  

  8. -------sem details---------  

  9. semnum:0, semval:16  

  10. semnum:1, semval:8  

  11. [redhat@localhost sem]$ kill -9 3073  

  12. [redhat@localhost sem]$ kill -9 3074  

  13. [redhat@localhost sem]$ ./seminfo 131075  

  14. key:585c7c37  

  15. semid:131075  

  16. nsems:2  

  17. -------sem details---------  

  18. semnum:0, semval:16  

  19. semnum:1, semval:10  

  20. [2]+  已殺死               ./semop 131075 1 -2 1 15  

相關文章
相關標籤/搜索