男女做那個能看的視頻網(wǎng)站新產(chǎn)品宣傳推廣策劃方案
在多進程的服務程序中,如果子進程收到退出信號,子進程自行退出。如果父進程收到退出信號,應該先向全部的子進程發(fā)送退出信號,然后自己再退出。
演示demo程序
#include <iostream> // 包含輸入輸出流庫,用于輸入輸出操作
#include <unistd.h> // 包含標準的UNIX系統(tǒng)調(diào)用庫,提供對POSIX操作系統(tǒng)API的訪問
#include <signal.h> // 包含信號處理庫,用于處理進程間通信中的信號using namespace std;void FathEXIT(int sig); // 聲明父進程退出處理函數(shù)
void ChldEXIT(int sig); // 聲明子進程退出處理函數(shù)int main ()
{for(int i = 1; i <= 64; i ++ )signal(i, SIG_IGN); // 忽略所有信號,防止其他信號中斷當前程序的執(zhí)行signal(SIGTERM, FathEXIT); // 設置SIGTERM信號的處理函數(shù)為FathEXITsignal(SIGINT, FathEXIT); // 設置SIGINT信號的處理函數(shù)為FathEXITwhile(1){if(fork() > 0) // fork()函數(shù)創(chuàng)建子進程,大于0為父進程{sleep(5); // 父進程等待5秒continue; // 繼續(xù)下一次循環(huán)}else // 小于0為子進程{signal(SIGTERM, ChldEXIT); // 設置SIGTERM信號的處理函數(shù)為ChldEXITsignal(SIGINT, SIG_IGN); // 忽略SIGINT信號while(1){cout << "子進程" << getpid() << "正在運行中。\n"; // 輸出子進程的進程IDsleep(3); // 子進程等待3秒continue; // 繼續(xù)下一次循環(huán)}}}
}void FathEXIT(int sig)
{signal(SIGINT, SIG_IGN); // 忽略SIGINT信號signal(SIGTERM, SIG_IGN); // 忽略SIGTERM信號cout << "父進程退出, sig = " << sig <<endl; // 輸出父進程退出信息kill(0, SIGTERM); // 向當前進程組的所有進程發(fā)送SIGTERM信號,結(jié)束進程exit(0); // 程序正常退出
}void ChldEXIT(int sig)
{signal(SIGINT, SIG_IGN); // 忽略SIGINT信號signal(SIGTERM, SIG_IGN); // 忽略SIGTERM信號cout << "子進程" << getpid() << "退出, sig = " << sig << endl; // 輸出子進程退出信息exit(0); // 程序正常退出
}
這段代碼實現(xiàn)了一個父子進程模型,父進程創(chuàng)建子進程,父進程每隔5秒繼續(xù)循環(huán),子進程每隔3秒輸出自身進程ID。
注意:該代碼在處理信號時使用了全局變量,不符合良好的編程實踐。在實際開發(fā)中,應該避免使用全局變量,而是使用更為合適的方式進行進程間通信和信號處理。