台州网站优化方案,微商分销,天宁区建设局网站,找不到网站后台怎么办在多进程的服务程序中#xff0c;如果子进程收到退出信号#xff0c;子进程自行退出。如果父进程收到退出信号#xff0c;应该先向全部的子进程发送退出信号#xff0c;然后自己再退出。 演示demo程序
#include iostream // 包含输入输出流库#xff0c;用于输…在多进程的服务程序中如果子进程收到退出信号子进程自行退出。如果父进程收到退出信号应该先向全部的子进程发送退出信号然后自己再退出。 演示demo程序
#include iostream // 包含输入输出流库用于输入输出操作
#include unistd.h // 包含标准的UNIX系统调用库提供对POSIX操作系统API的访问
#include signal.h // 包含信号处理库用于处理进程间通信中的信号using namespace std;void FathEXIT(int sig); // 声明父进程退出处理函数
void ChldEXIT(int sig); // 声明子进程退出处理函数int main ()
{for(int i 1; i 64; i )signal(i, SIG_IGN); // 忽略所有信号防止其他信号中断当前程序的执行signal(SIGTERM, FathEXIT); // 设置SIGTERM信号的处理函数为FathEXITsignal(SIGINT, FathEXIT); // 设置SIGINT信号的处理函数为FathEXITwhile(1){if(fork() 0) // fork()函数创建子进程大于0为父进程{sleep(5); // 父进程等待5秒continue; // 继续下一次循环}else // 小于0为子进程{signal(SIGTERM, ChldEXIT); // 设置SIGTERM信号的处理函数为ChldEXITsignal(SIGINT, SIG_IGN); // 忽略SIGINT信号while(1){cout 子进程 getpid() 正在运行中。\n; // 输出子进程的进程IDsleep(3); // 子进程等待3秒continue; // 继续下一次循环}}}
}void FathEXIT(int sig)
{signal(SIGINT, SIG_IGN); // 忽略SIGINT信号signal(SIGTERM, SIG_IGN); // 忽略SIGTERM信号cout 父进程退出 sig sig endl; // 输出父进程退出信息kill(0, SIGTERM); // 向当前进程组的所有进程发送SIGTERM信号结束进程exit(0); // 程序正常退出
}void ChldEXIT(int sig)
{signal(SIGINT, SIG_IGN); // 忽略SIGINT信号signal(SIGTERM, SIG_IGN); // 忽略SIGTERM信号cout 子进程 getpid() 退出 sig sig endl; // 输出子进程退出信息exit(0); // 程序正常退出
}这段代码实现了一个父子进程模型父进程创建子进程父进程每隔5秒继续循环子进程每隔3秒输出自身进程ID。
注意该代码在处理信号时使用了全局变量不符合良好的编程实践。在实际开发中应该避免使用全局变量而是使用更为合适的方式进行进程间通信和信号处理。