一、什么是信号?

《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中的信号及进程守护的应用实例分享相关推荐

  1. linux中的信号2——进程如何处理信号?

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.signal函数介绍 (1)举例:用signal函数处理SIGINT信号(这个信号由ctrl+c时发出) 默认 ...

  2. linux内核定义的常用信号6,Linux中的信号

    在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...

  3. 在python中、实例变量在类的内部通过_【python】类变量、实例变量

    1.类变量.实例变量概念 类变量: 类变量就是定义在类中,但是在函数体之外的变量.通常不使用self.变量名赋值的变量.类变量通常不作为类的实例变量的,类变量对于所有实例化的对象中是公用的. 实例变量 ...

  4. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  5. 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表

    文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...

  6. 【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程

    目录 即看即用 详细说明 systemctl 的用途 用法 例子:以管理我们的程序verdaccio为例 开机启动 设置程序开机启动.关闭.启用/禁用服务以vsftpd为例 三个部分[Unit].[S ...

  7. linux 启动2个tomcat,在LINUX中启动多个TOMCAT

    1.建立LINUX用户和组 Groupadd tomcat Useradd user1 -g tomcat Useradd user2 -g tomcat Useradd user3 -g tomca ...

  8. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为

    Linux pthread 和 java thread 的是 / 非守护线程的行为 pthread_xxx 的函数并没有直接提供设置一个 pthread 为守护线程的 API 而 pthread_at ...

  9. linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt

    操作系统教程-Linux实例分析 孟庆昌 第8章 死锁new.ppt 第8章 死锁 8.1 概述 8.2 产生死锁的条件 8.3 死锁的预防 8.4 死锁的避免 8.5 死锁的检测与恢复 8.6 处理 ...

最新文章

  1. 深入解析Windows操作系统笔记——CH1概念和术语
  2. 设置模态框开始是隐藏状态_有限元仿真分析误差来源之材料参数设置,小心为妙!...
  3. 9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes
  4. 第四次上课 PPT作业
  5. 6月15日起,刷卡机不能自选商户了,这样会有多少卡被封掉?
  6. html2canvas关于图片不能正常截取
  7. Linux怎么取消ftp的匿名访问功能
  8. Visual Studio Code 1.42 发布
  9. PHP的接口(interface)
  10. Linux 命令(120)—— route 命令
  11. %99的C语言初学者都会犯的错误——奇妙的数组(玄学)
  12. 管理感悟:不要别人扫自己的屁股
  13. 代码修改及模型复查 12-6
  14. Hadoop学习之旅
  15. PCIE协议解析 synopsys IP loopback 读书笔记(1)
  16. 东北大学软件项目管理与过程改进题库——首字母排序
  17. PHP ThinkPHP 命名空间引入(use )
  18. python eel_Python django-eel包_程序模块 - PyPI - Python中文网
  19. MATLAB中通用桥晶闸管的型号,基于MATLAB的电力电子技术仿真分析
  20. opencv之图像矩 image moments

热门文章

  1. 机器学习数据预处理之缺失值:样本删除
  2. 影像组学视频学习笔记(11)-支持向量机(SVM)(理论)、Li‘s have a solution and plan.
  3. wget,curl 下载文件
  4. 中国高校生物信息学中心有哪些
  5. hppRNA-基于Snakemake的便捷无参数管道,可用于众多样品的RNA-Seq分析
  6. 致命错误: zlib.h:没有那个文件或目录
  7. 新一代测序技术Sparc
  8. Android六大布局 LinearLayout(线性布局)
  9. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
  10. 使用Keras计算余弦相似度(Cosine Similarity)