一:守护进程
守护进程与后台进程区别:
- 守护进程与终端不挂钩,后台进程与终端挂钩(会往终端输出信息)
- 守护进程不因终端的状态所改变,始终在后台运行,后台进程会随终端的关闭而关闭
二:编写脚本判断程序是否在运行
#include <stdio.h>
#include <string.h>
int main()
{
FILE *file;
char *cmd = "ps -elf | grep douyin | grep -v grep"; //查看进程是否存在并且-v可以过滤掉
//grep的这个进程,以防下面的判断误判
char buffer[128] = {'\0'};
file = popen(cmd,"r"); //popen可以将查看的内容打印出来显示
fgets(buffer,128,file);
if(strstr(buffer,"douyin") != NULL){
printf("douyin pro is running\n");
}else{
printf("douyin pro is not runing\n");
}
printf("BUFFER:%s\n",buffer);
return 0;
}
二:将守护进程与脚本结合,实现程序不会被关闭
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdbool.h>
static bool flag = true;
void handler(int sig)
{
printf("I got a signal %d\nI am quitting\n",sig);
flag = false;
}
int judMnt()
{
FILE *file;
char *cmd = "ps -elf | grep douyinpro | grep -v grep";
char buffer[128] = {'\0'};
file = popen(cmd,"r");
fgets(buffer,128,file);
if(strstr(buffer,"douyin") != NULL){
return 0;
}else{
return -1;
}
printf("BUFFER:%s\n",buffer);
}
int main()
{
time_t t;
int fd;
if(-1 == daemon(0,0)){
printf("daemon error\n");
exit(-1);
}
struct sigaction act;
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(sigaction(SIGQUIT,&act,NULL)){
printf("sigaction error\n");
exit(0);
}
while(flag){
if(judMnt() == -1){
system("/home/orangepi/hardwareSoft/douyin/douyinpro /dev/ttyS5 &"); //发送指
//令查看进程是否还在运行,若没有则开启
//加&表示是在后台运行
}
sleep(2);
}
return 0;
}
sudo vi /etc/rc.local
在里面加入守护进程的绝对路径(pwd),开机会自启动