//h文件 main.h
1 //处理进程,使其不会引发僵尸进程 2 int init_daemon(void); 3 //输出函数 4 void WriteLog(char* fmt, ...); 5 //子进程处理函数 6 void subMain(pid_t parentID, pid_t id, int* ret); 7 //主函数 8 int main();
//c文件 main.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <signal.h> 6 #include <sys/param.h> 7 #include <sys/types.h> 8 #include <sys/stat.h> 9 #include <fcntl.h> 10 #include <stdarg.h> 11 #include <errno.h> 12 #include "main.h" 13 14 /* 15 参考宏:__FILE__, __FUNCTION__, __LINE__ 16 输出日志信息到屏幕及日志文件 17 */ 18 void WriteLog(char* fmt, ...) 19 { 20 char str[4096]={0}; 21 va_list args; 22 va_start(args, fmt); 23 vsprintf(str, fmt, args); 24 va_end(args); 25 26 //输出信息到屏幕 27 printf(str); 28 29 /* 30 把信息写入日志文件中 31 日志文件名为代码文件名,便于程序调试 32 */ 33 FILE *pfile=NULL; 34 char fileName[512]={0}; 35 sprintf(fileName, "%s/log/", getenv("HOME")); 36 37 //判断日志目录是否存在,如果不存在则建立日志的目录 38 if (0!=access(fileName, F_OK)) 39 { 40 if (0!=mkdir(fileName, 777)) 41 { 42 printf("创建日志目录时出错:%s\n", strerror(errno)); 43 return; 44 } 45 } 46 47 //日志目录已建立,生成日志文件名 48 strcat(fileName, __FILE__); 49 strcat(fileName, ".log"); 50 51 //如果文件不存在则建立文件,如果存在则附加到文件的后面。 52 if ((pfile=fopen(fileName, "a+"))==NULL) 53 { 54 printf("打开日志文件出错: %s\n", strerror(errno)); 55 return; 56 } 57 int nRet=fputs(str, pfile); 58 if (EOF==nRet) 59 { 60 printf("写入日志文件出错: %s\n", strerror(errno)); 61 } 62 fclose(pfile); 63 } 64 65 int init_daemon(void) 66 { 67 pid_t pid = 0; 68 69 if((pid = fork()) < 0) 70 { 71 return -1; 72 } 73 else if (pid!=0) 74 { 75 exit(0); 76 } 77 78 setsid(); 79 80 if((pid = fork()) < 0) 81 { 82 return -1; 83 } 84 else if(pid != 0) 85 { 86 exit(0); 87 } 88 89 umask(0); 90 return 0; 91 } 92 void subMain(pid_t parentID, pid_t id, int* ret) 93 { 94 *ret=100; 95 WriteLog("[%s]:sub[%d] is running...\n", __FUNCTION__, (int)id); 96 } 97 int main() 98 { 99 WriteLog("[%s]:进程[%d]开始运行...\n", __FUNCTION__, (int)getpid()); 100 int i=0;//循环变量 101 int nSubCount=0; 102 103 //处理进程的父进程 104 init_daemon(); 105 106 //linux下忽略SIGCHLD信号则不会产生僵尸进程 107 struct sigaction act; 108 act.sa_handler=SIG_IGN; 109 sigemptyset(&act.sa_mask); 110 act.sa_flags=SA_NOCLDWAIT; 111 if (sigaction(SIGCHLD, &act, 0)<0) 112 { 113 WriteLog("[%s]:进程启动失败!\n", __FUNCTION__); 114 return 1; 115 } 116 117 //产生子进程以处理任务 118 while(1) 119 { 120 WriteLog("[%s]:主进程[%d]正在运行...\n",__FUNCTION__, (int)getpid()); 121 122 nSubCount=10; 123 //生成nSubCount个进程来处理任务 124 for(i=0;i<nSubCount;i++) 125 { 126 pid_t parent_pid=getpid(); 127 pid_t pid=fork(); 128 if (0==pid) 129 { 130 WriteLog("[%s]:子进程[%d-%d]已启动...\n", __FUNCTION__, parent_pid, (int)getpid()); 131 132 int nRet=0; 133 subMain(parent_pid, getpid(), &nRet); 134 135 WriteLog("[%s]:子进程[%d-%d]已退出,[%d]!\n", __FUNCTION__, parent_pid, (int)getpid(), nRet); 136 exit(0); 137 } 138 } 139 //每3秒执行一次循环操作 140 sleep(3); 141 } 142 WriteLog("[%s]:end %d\n", __FUNCTION__, (int)getpid()); 143 return 0; 144 }
redhat主子进程示例
最新推荐文章于 2023-04-29 14:38:13 发布