上次写的守护进程其实在本质上不算守护进程,这是原来程序的问题。写守护进程还是要按照标准的形式来书写,下面贴出我的源程序:两个进程之间采用信号通信。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <syslog.h>
#include <sys/wait.h>
#include <stdlib.h>
int waitTimer_1s;
extern void handler(int a);
int main (void)
{
int fd, fdtablesize;
pid_t pid;
pid_t pid_daemon;
char arg1[30];
//char *argv[] = {"/WIPCamera/IPCamera",arg1,NULL};
//char *argv[] = {"/home/zouzheng/work/zz",arg1,NULL};
//忽略终端 I/O信号,STOP信号
//signal(SIGTTOU,SIG_IGN);
//signal(SIGTTIN,SIG_IGN);
//signal(SIGTSTP,SIG_IGN);
// signal(SIGHUP ,SIG_IGN);
// 父进程退出,程序进入后台运行
//if(fork() != 0)
// exit(1);
if((pid = fork()) > 0)
{
exit(0);
}
if(pid < 0)
{
system("reboot");
exit(1);
}
//pid_daemon = getpid();
//signal(SIGUSR1,handler);
// printf("pid_daemon=%d\n", pid_daemon);
//sprintf(arg1,"/WIPCamera/IPCamera %d &",pid_daemon);
//sprintf(arg1,"/home/zouzheng/work/zz %d",pid_daemon+1);
// system(arg1);
//创建一个新的会议组
if(setsid() < 0)
exit(1);
//setsid();
// 子进程退出,孙进程没有控制终端了
//if(fork() != 0)
// exit(1);
// if((pid = fork()) > 0)
// {
// exit(0);
// }
// if(pid < 0)
// {
// system("reboot");
// exit(1);
// }
// 关闭打开的文件描述符,包括标准输入、标准输出和标准错误输出
for(fd = 3,fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
close(fd);
//for(i=0; i<NOFILE; ++i)
// close(i);
// 改变当前工作目录
//if(chdir("/tmp") == -1)
// exit(1);
chdir("/");
//重设文件创建掩模
umask(0);
// 忽略SIGCHLD信号
//signal(SIGCHLD, SIG_IGN);
pid_daemon = getpid();
signal(SIGUSR1,handler);
printf("pid_daemon=%d\n", pid_daemon);
sprintf(arg1,"/WIPCamera/IPCamera %d &",pid_daemon);
//sprintf(arg1,"/home/zouzheng/work/zz %d",pid_daemon+1);
system(arg1);
waitTimer_1s=0;
while(1)
{
sleep(1);
if (waitTimer_1s > 20)
{
system("reboot");
waitTimer_1s=0;
}
else
waitTimer_1s++;
}
return(0);
}
void handler(int a)
{
waitTimer_1s = 0;
//printf("waitTimer_1s=%d\n",waitTimer_1s);
}
另一个进程里采用如下形式:
static pid_t pid_IPCamera;
void *UsrSignal(void *arg);
int main(int argc, char **argv)
{
pthread_t hUsrSignal;
pid_t pid_daemon;
pid_daemon = (pid_t)atoi(argv[1]);//
//printf("pid_daemon=%d\n", pid_daemon); //调试使用
pid_IPCamera = pid_daemon;
pthread_create(&hUsrSignal, NULL, UsrSignal, NULL);
}
void * UsrSignal(void *arg)
{
printf("pid_IPCamera = %d\n",pid_IPCamera);
while(1)
{
sleep(3);
kill(pid_IPCamera, SIGUSR1);
}
//kill(pid_IPCamera, SIGUSR1);
return 0;
}