<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脚本控制守护进程的实现到此为止!!