首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 多進程信號量同步實現父子進程輪流打印

     編輯:程式設計綜合問答

問題現象

原代碼使用 fork() + SIGUSR1/SIGUSR2 信號同步,但信號處理函數註冊順序、掩碼設置錯誤,導致進程死循環甚至系統關機。

核心修正點

  1. 信號處理註冊順序:必須在 fork() 後,父子進程分別註冊各自處理函數,避免繼承錯誤掩碼。
  2. 阻塞信號集設置:使用 sigemptyset + sigaddset 精確控制處理函數執行期間阻塞的信號,防止重入。
  3. 同步邏輯:父進程發送 SIGUSR1 給子進程,子進程處理完發送 SIGUSR2 給父進程,雙方交替 pause() 等待信號。

修正代碼關鍵片段

// 子進程
sigaction(SIGUSR1, &cact, &ocact); // 註冊處理 SIGUSR1
while (1) {
    pause(); // 等待父進程信號
    // 打印奇數...
    kill(getppid(), SIGUSR2); // 通知父進程
}

// 父進程
sigaction(SIGUSR2, &fact, &ofact); // 註冊處理 SIGUSR2
while (1) {
    kill(cpid, SIGUSR1); // 通知子進程
    pause(); // 等待子進程信號
    // 打印偶數...
}

關鍵函數

  • sigaction():替代舊版 signal(),支持信號掩碼、標志位,更可靠。
  • pause():掛起進程直到捕獲信號,實現同步等待。

正確處理信號掩碼與註冊順序,即可實現穩定的父子進程交替打印。

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