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