首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言進程互斥實戰:使用 wait() 實現父子進程有序存取臨界資源

     編輯:關於C語言

問題背景

fork() 建立的子進程與父進程並發執行,對共享資源 (如全域變數、檔案、終端機) 的存取順序不可預測。需透過同步機制確保有序存取。

無同步機制:競爭條件示範

int count = 0;
pid = fork();
if (pid > 0) {  // 父進程
    count++;
    printf("Father: count=%d\n", count);
} else if (pid == 0) {  // 子進程
    count++;
    printf("Son: count=%d\n", count);
}
/* 輸出順序不定,count 互不影響 (各自複製體) */

使用 wait() 實現父進程等待子進程

pid = fork();
if (pid > 0) {  // 父進程
    printf("Father running (PID=%d)\n", getpid());
    pid_t child_pid = wait(&status);  // 阻塞直到子進程結束
    if (child_pid > 0) {
        printf("Child %d finished\n", child_pid);
        count++;  // 現在安全存取
        printf("Father: count=%d\n", count);
    }
} else if (pid == 0) {  // 子進程
    printf("Son running (PID=%d)\n", getpid());
    count++;
    printf("Son: count=%d\n", count);
}
/* 輸出順序固定:子進程先跑完,父進程才繼續 */

執行結果對比

場景輸出順序說明
無 wait交錯不定父子並發,各自獨立 count 副本
有 wait子進程完整輸出 → 父進程輸出父進程阻塞於 wait(),子進程結束後才繼續

wait(&status) 回傳結束的子進程 PID,status 可透過 WIFEXITED、WEXITSTATUS 宏檢查退出狀態。實務上常搭配訊號處理、waitpid() 實現更精細控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved