Linux下Service守护进程开发和Shell脚本控制Daemon

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">   在我开发Android的过程中遇到Service组件简单的将就是不需要界面的背后进程,默默执行任务。现在我们学习一下Linux下守护进程Service是怎么实现的,也同时学习一下通过shell脚本来控制进程的开关。</span>

    守护进程实现有着默认的思路fork父子进程,关闭父进程,将子进程进行与控制台脱离的操作,我这边的守护进程demo实现的是通过信号来控制守护进程的输出。首先看一下代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
#include <syslog.h>
#include <errno.h>  

int mysignal(int signo,void(*func)(int))
{
   struct sigaction act,oact;
   act.sa_handler = func;
   sigemptyset(&act.sa_mask);
   act.sa_flags = 0;
   return sigaction(signo,&act,&oact); 
   
}


void setDaemon()
{
  pid_t pid,sid;
  pid = fork();
  if(pid < 0)
  {
    printf("fork failuer : %s\n",strerror(errno));
    exit(EXIT_FAILURE);
  }  
  if(pid > 0)
  {
    exit(EXIT_SUCCESS);
  }
  
  if( (sid = setsid()) < 0  )
  {
    printf("set sid failure: %s\n",strerror(errno));
    exit(EXIT_FAILURE);
  }

}

void listenFifo()
{
  const char* filename = "shaofifo";
  int len = 0;
  char buf[1024];
  memset(buf,0,sizeof(buf));
  int fd = open(filename,O_RDONLY);
  if(fd == -1)
  {
    printf("open failure :%s\n",strerror(errno));
    exit(EXIT_FAILURE);
  }
  len = read(fd,buf,sizeof(buf));
  if(len > 0)
  {
    if( buf[strlen(buf) -1] == '\n')
    {
       buf[strlen(buf) -1] = 0;
    }
    close(STDOUT_FILENO);
    open(buf,O_WRONLY);

  } 


}


void Catch_Signal(int signo)
{
   switch(signo)
   {
     case SIGINT:
      listenFifo();
     break;

   }


}

 
int main(int arg,char* args[])
{ 
 
  setDaemon(); 
  mysignal(SIGINT,Catch_Signal);
  while(1)
  {
     puts("hello world !!");
     sleep(1);
  }  

    
  return EXIT_SUCCESS;
}

   

  然后 我们在管道文件输入另外一个控制台的设备路径,子进程就是守护进程会关闭标准输出 然后接收信号读取管道文件中的设备路径,打开设备,继续输出

  

  在shaofifo管道文件输入设备路径,子进程读取后输出内容 这里主要是学习了守护进程的实现  setsid()方法就是让子进程脱离控制台

  一般守护进程是需要shell脚本进行控制的 ,看一下shell脚本的实现

#! /bin/sh

WHOAMI=`whoami`

PID=`ps -u $WHOAMI | grep service | awk '{print $1}'`

if( test "$1" = "start") then
   if(test "$PID" = "") then
    ./service
   fi
fi

if(test "$1" = "stop")then
  if(test "$PID" != "") then
    kill $PID
  fi
fi

if(test "$1" = "status")then
  if(test "$PID" = "") then
   echo "not run"
  fi

  if(test "$PID" != "")then
   echo "run"
  fi   

fi



到这边 通过shell脚本控制守护进程的实现到此为止!!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值