原代碼使用 fork() + SIGUSR1/SIGUSR2 信號同步,但信號處理函數註冊順序、掩碼設置錯誤,導致進程死循環甚至系統關機。
fork() 後,父子進程分別註冊各自處理函數,避免繼承錯誤掩碼。sigemptyset + sigaddset 精確控制處理函數執行期間阻塞的信號,防止重入。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():掛起進程直到捕獲信號,實現同步等待。正確處理信號掩碼與註冊順序,即可實現穩定的父子進程交替打印。