redhat主子进程示例

//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 }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值