信号的自启动进程
来源:互联网 发布:c语言函数的定义与声明 编辑:程序博客网 时间:2024/06/05 08:43
捕获指定的信号来重启进程:SIGILL,SIGBUS, SIGFPE,SIGSEGV,SIGUSR1,SIGABRT
#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/wait.h>#include <errno.h>#include <stdlib.h>void child_process();bool parent_process(pid_t child_pid, int& exit_code);int iExitFlag = 0;int main(int argc, char** argv){int exit_code=1;while(true){pid_t pid = fork();if(-1 == pid){fprintf(stderr, "fork error!\n");break;}else if(0 == pid){child_process(argc, argv);}else if (!parent_process(pid, exit_code)){break;}}return exit_code;}bool parent_process(pid_t child_pid, int& exit_code){printf("parent process is %d, and its work process is %d\n", getpid(), child_pid);bool restart = false;while(true){int status;int retval = waitpid(child_pid, &status, 0);if (retval == -1){if (EINTR == errno){continue;}else{printf("Wait %d error, errno: %s!\n", child_pid, strerror(errno));}}else if (WIFSTOPPED(status)){exit_code = WSTOPSIG(status);}else if (WIFEXITED(status)){exit_code = WEXITSTATUS(status);}else if (WIFSIGNALED(status)){int signo = WTERMSIG(status);exit_code = signo;if ((SIGILL == signo)|| (SIGBUS == signo)|| (SIGFPE == signo)|| (SIGSEGV == signo)|| (SIGUSR1 == signo)|| (SIGABRT == signo)){restart = true;printf("Process %d will restart self for signal %s!\n", child_pid, strsignal(signo));usleep(20);}}else{printf("Process %d was exited, but unkonw error.\n", child_pid);}break;}return restart;}void sig_int(int signo){if (signo == SIGUSR1){iExitFlag = 1;}}void child_process(int argc, char**argv){int errcode = 0;sigset_t sigset;sigset_t old_sigset;int exit_signo = SIGUSR1;signal(SIGUSR1, sig_int);if (exit_signo > 0){if (-1 == sigemptyset(&sigset)){printf("Initialized signal set error!\n");exit(1);}if (-1 == sigaddset(&sigset, exit_signo)){printf("add %s to signal set error!\n", strsignal(exit_signo));exit(1);}if (-1 == sigprocmask(SIG_BLOCK, &sigset, &old_sigset)){printf("Block sigset error!\n");exit(1); }} sigset_t emptyMask;sigemptyset(&emptyMask);while(iExitFlag == 0){sigsuspend(&emptyMask);}exit(errcode);}
- 信号的自启动进程
- gdb启动时,进程收到中断信号造成无法正常启动的解决办法
- SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- android service后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- -------------------Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Service后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android SERVICE后台服务进程的自启动和保持
- Android Service后台服务进程的自启动和保持
- Struts2实现单文件上传
- 让IE的地址栏在弹出窗口也显示
- linux webloigc10.0 sever启动慢
- 表空间时间点恢复(TSPITR)简介
- Visual Studio 2010 单元测试目录
- 信号的自启动进程
- String类型两种不同实例化方式
- (二)AJAX异步传输(采用非匿名函数和匿名函数) 实例.
- VC6升至VC2010的常见错误及处理
- ALV可编辑行输入数据后抓取回车事件
- 记录 分组框效果html - fieldset
- 远程重装系统
- C#高级编程--比较对象的相等性
- Hadoop FS Shell命令 http://hadoop.apache.org/docs/stable/file_system_shell.html