linux守护实例有什么用,linux中的信号及进程守护的应用实例分享
一、什么是信号?
《1》信号是用来向进程通知事件
《2》每个信号已SIG开头,信号名定义在#include
二、进程收到信号,可以做出三种措施
《1》忽略信号
《2》捕获,需要执行一段信号处理的特殊代码
《3》允许执行信号的默认操作
三、相关函数
《1》pause()函数,一直暂停等待
挂起调用它的进程,直到任何消息到达
发送信号和捕获信号是相辅相成的,每个信号除了决定响应SIGSTOP和SIGKILL外的其他进程,这两个消息不可以被忽略
《2》回调函数
含义:函数指针作为参数传递给另外一个函数,当这个指针被用来调用其所指函数时,称为回调函数
《3》捕捉信号所用的函数
(1)signal函数
void* signal(int signo, void(*func)(int));
int signo//捕捉什么信号
void(*func)(int)//捕捉信号的回调函数
(2)sigaction函数
int sigaction(int signo,const struct sigaction* act,struct sigaction* oact)
//int signo:要捕捉的信号
//const struct sigaction* act:信号现处的状态
//struct sigaction* oact返回之前的状态
鉴于,signal函数有些古老,使用的时候,会出现一些问题,建议使用sigaction,但是,该函数参数有些复杂,所以可以封装一个函数, 每次调用即可,下面为封装方法:
int signal1(int signo,void(*func)(int))
{
struct sigaction act,oact;
act.sa_hardler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
return sigaction(signo,&act,&oact);
}
每次需要捕捉信号的时候,只用在主调函数中调用signal1就可以了signal1(SIGINT,catch_signal);
《4》kill相关函数
《1》使用kill命令
《2》使用kill函数
int kill(pid_t pid,int sig)
//pid_t pid:指定要杀死的进程,将信号发送给进程
//int sig:发送的进程
《5》raise()函数
int raise(int signo)
//等价于kill(getpid(),signo)
《6》alarm()函数
alarm函数设置一个计时器,当计时器到了就发送一个SIGALRM信号
unsigned int alarm(unsigned int seconds)
《7》abort()函数
当执行abort函数时,会发送一个SIGABRT信号,导致信号进程异常终止
void abort(void)
四、守护进程
《1》创建守护进程步骤总结
(1)父进程中执行fork后,执行exit()退出;
(2)在子进程中调用setsid()
(3)让根目录”/”成为子进程的工作目录
(4)将子进程的umusk变为0
(5)关闭任何不需要的文件描述符
《2》pid_t setsid()
用来创建一个新会话和一个新进程组,然后守护进程成为新会话和新进程组的领导;
该函数一旦调用,就不再拥有任何控制终端,可以通过svslog提供服务,记录守护进程的各种输出的信息;
《3》chdir
int chdir(const char* pathname)
//改变当前目录
//例如,在主函数中调用 : chdir("/");
五、应用实例
#include
#include
#include
#include
#include
#include
#include
#include
#include
void readfifo()//读取fifo管道文件内容
{
int len = 0;
char buf[1024];
memset(buf, 0 ,sizeof(buf));
int fd = open("/home/dw/dwcode/fifo1",O_RDONLY);
if(fd == -1)
{
printf("open fifo error%s\n",strerror(errno));
return ;
}
while((len = read(fd,buf,sizeof(buf)))> 0)//循环读取管道内容,直到管道文件被关闭,循环结束
{
printf("%s\n",buf);
memset(buf ,0, sizeof(buf));
}
close(fd);
return;
}
void setdaemon()//把程序设置为deamo状态
{
pid_t pid = fork();
if(pid == -1)
{
printf("fork error!\n");
exit(0);
}
if(pid > 0)
{
exit(0);
}
if(pid == 0)
{
setsid();
chdir("/");
/*umask(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
*/
}
}
int main(int arg,char*args[])
{
setdaemon();
readfifo();
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
void writefifo()//写数据到管道
{
int len = 0;
char buf[1024];
memset(buf , 0 ,sizeof(buf));
int fd = open("/home/dw/dwcode/fifo1",O_WRONLY);
if(fd == -1)
{
printf("write fifo1 error%s\n",strerror(errno));
return ;
}
while(1)
{
memset(buf,0,sizeof(buf));
scanf("%s",buf);
write(fd, buf, sizeof(buf));
} close(fd);
return ;
}
int main()
{
writefifo();
return 0;
}
.SUFFIXES:.c .o//makefile的书写
CC=gcc
SRCS1=readfifo.c
SRCS2=writefifo.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=readfifo
EXEC2=writefifo
all:$(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo '^-^ ^-^ ^-^ ^-^ok ^-^ ^-^ ^-^ ^-^'
.c .o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f core*
11111111111111111111111111
22222222222222222222222222
3333333333333333333333333
linux守护实例有什么用,linux中的信号及进程守护的应用实例分享相关推荐
- linux中的信号2——进程如何处理信号?
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.signal函数介绍 (1)举例:用signal函数处理SIGINT信号(这个信号由ctrl+c时发出) 默认 ...
- linux内核定义的常用信号6,Linux中的信号
在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...
- 在python中、实例变量在类的内部通过_【python】类变量、实例变量
1.类变量.实例变量概念 类变量: 类变量就是定义在类中,但是在函数体之外的变量.通常不使用self.变量名赋值的变量.类变量通常不作为类的实例变量的,类变量对于所有实例化的对象中是公用的. 实例变量 ...
- 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )
文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...
- 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表
文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...
- 【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程
目录 即看即用 详细说明 systemctl 的用途 用法 例子:以管理我们的程序verdaccio为例 开机启动 设置程序开机启动.关闭.启用/禁用服务以vsftpd为例 三个部分[Unit].[S ...
- linux 启动2个tomcat,在LINUX中启动多个TOMCAT
1.建立LINUX用户和组 Groupadd tomcat Useradd user1 -g tomcat Useradd user2 -g tomcat Useradd user3 -g tomca ...
- linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为
Linux pthread 和 java thread 的是 / 非守护线程的行为 pthread_xxx 的函数并没有直接提供设置一个 pthread 为守护线程的 API 而 pthread_at ...
- linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt
操作系统教程-Linux实例分析 孟庆昌 第8章 死锁new.ppt 第8章 死锁 8.1 概述 8.2 产生死锁的条件 8.3 死锁的预防 8.4 死锁的避免 8.5 死锁的检测与恢复 8.6 处理 ...
最新文章
- 深入解析Windows操作系统笔记——CH1概念和术语
- 设置模态框开始是隐藏状态_有限元仿真分析误差来源之材料参数设置,小心为妙!...
- 9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes
- 第四次上课 PPT作业
- 6月15日起,刷卡机不能自选商户了,这样会有多少卡被封掉?
- html2canvas关于图片不能正常截取
- Linux怎么取消ftp的匿名访问功能
- Visual Studio Code 1.42 发布
- PHP的接口(interface)
- Linux 命令(120)—— route 命令
- %99的C语言初学者都会犯的错误——奇妙的数组(玄学)
- 管理感悟:不要别人扫自己的屁股
- 代码修改及模型复查 12-6
- Hadoop学习之旅
- PCIE协议解析 synopsys IP loopback 读书笔记(1)
- 东北大学软件项目管理与过程改进题库——首字母排序
- PHP ThinkPHP 命名空间引入(use )
- python eel_Python django-eel包_程序模块 - PyPI - Python中文网
- MATLAB中通用桥晶闸管的型号,基于MATLAB的电力电子技术仿真分析
- opencv之图像矩 image moments
热门文章
- 机器学习数据预处理之缺失值:样本删除
- 影像组学视频学习笔记(11)-支持向量机(SVM)(理论)、Li‘s have a solution and plan.
- wget,curl 下载文件
- 中国高校生物信息学中心有哪些
- hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析
- 致命错误: zlib.h:没有那个文件或目录
- 新一代测序技术Sparc
- Android六大布局 LinearLayout(线性布局)
- android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
- 使用Keras计算余弦相似度(Cosine Similarity)