open函數中參數選項O_EXCL解析


參考: https://blog.csdn.net/abcd1f2/article/details/49820889

設想這樣一個需求:某個任務要求只能單個進程執行,不能多個進程同時執行。但是不能確保多個進程同時啟動,嘗試執行這個任務。
這樣就進一步要求,只有第一個執行的進程可以繼續,后續嘗試執行的進程都報錯退出。

方案之一就是使用帶有O_EXCL標志的open()嘗試打開一個文件。

第一個進程執行時文件並不存在,它能成功創建文件並繼續執行。
第二個及后續的其它進程會因為文件已存在,從而open()失敗,進程退出。如果不使用O_EXCL標志,那你的代碼可能要這樣寫:

if( access(file, R_OK) == -1 )/* 首先檢查文件是否存在 */
open(file, O_RDWR | O_CREAT,0666); /* 如果不存在,那我創建一個這樣的文件 */
.../* 繼續執行任務 */

這個邏輯是有潛在的問題的,那就是判斷文件是否存在與創建文件是兩個獨立的系統調用。

如果進程1執行access,判斷出文件並不存在;然后由於操作系統的調度策略,進程1暫停執行,進程2執行,進程2也會判斷出文件不存在。
最終結果就是:兩個進程調用open時都會成功,然后繼續執行。這樣就有多個進程同時執行這個任務了.

 20     int fd_dest=open(argv[2],O_WRONLY|O_CREAT|O_EXCL,0644);
 21     if(fd_dest==-1&&errno==EEXIST)
 22     {
 23         printf("recover it?");
 24         char choose;
 25         scanf("%c",&choose);
 26         if(choose=='y'||choose=='Y')
 27         {
 28             fd_dest=open(argv[2],O_WRONLY);
 29         }
 30         else
 31         {
 32             exit(1);
 33         }
 34     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM