上次写的守护进程其实在本质上不算守护进程,这是原来程序的问题。写守护进程还是要按照标准的形式来书写,下面贴出我的源程序:两个进程之间采用信号通信。
#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;
}