參考: 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 }