linux信号

【Linux】进程信号

匿名 (未验证) 提交于 2019-12-02 21:59:42
信号 1.基本概念 信号是操作系统通知某个进程有异常或有某种事件发生的通知机制 注意: ctrc+c产生的信号只能发送给前台进程,一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束,就可以接受新的命令,启动新的进程 Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像ctrl+c这种控制键产生的信号 前台进程可以在运行过程中用户随时可能按下ctrl+c而产生一个信号也就是说该进程的用户空间代码执行到任何地方都有可能收到SIGINT信号而终止,所以信号相对于进程的控制流程来说是异步的 编号1-31为普通信号,34-64为实时信号 2.信号的产生方式 键盘产生:用户在终端按下某些键时,终端驱动程序会发送给前台进程 硬件异常产生信号:如CPU除零运算,内核会发送一个SEGFPE,或当前进程非法访问内存地址,内核会发送一个SEGSEVG信号发送给该进程 调用系统函数向进程发信号 软件条件产生 (1)通过按键终端产生信号 SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump。 Core Dump 当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做 Core Dump。进程异常终止通常是因为有bug,比如非法访问内存导致错误

浅谈Linux 信号(Signal)

匿名 (未验证) 提交于 2019-12-02 21:59:42
1.在linux用命令 kill -l 查看系统信号 2.前32个信号是unix经典信号,后32为实时信号(自定义信号) 3.前台进程永远只有一个,后台进程可以有n个 4 用用命令ctl+c 可以结束唯一一个后台进程 5.产生信号的几种方式 alarm()定时器向内核发送当前进程发送SIGALRM信号 信号的传递过程: 注意:unix经典信号不支持排队,但是实际上最多支持一次排队(因为内核可帮助设置临时屏蔽字) 临时屏蔽字的作用:为了避免在处理信号的自定义动作干扰,当执行完捕捉动作后,该屏蔽解除 屏蔽字的三种设置方式: 信号捕捉的执行过程: 文章来源: 浅谈Linux 信号(Signal)

Linux进程信号

匿名 (未验证) 提交于 2019-12-02 21:59:42
信号的基本概念 signal.h 中找到,例如其中有定义#define SIGINT 2。编号34以上的是实时信号,34以下的信号是普通信号。而这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明,在命令行上输入man 7 signal: 产生信号 的方式: 进程收到信号后,常见的 信号处理 动作有以下三种: 忽略此信号。 前台进程与后台进程 //sig.c #include <stdio.h> int main(){ while ( 1 ); return 0 ; } 2.Ctrl-C产生的信号只能发给前台进程,不能发给后台进程。 前台进程: 后台进程: 3.后台进程使Shell不必等待进程结束就可以接受新的命令。而前台进程运行时占用SHELL,它运行的时候SHELL不能接受其他命令。 4.Shell可以同时运行一个前台进程和任意多个后台进程。 异步(Asynchronous) 的。后台进程不是任一进程都能做,要看实际情况。一般来说,如果某进程不需从键盘输入输出(交互少的)或者执行所需时间较长的话,就比较合适做后台进程。 产生信号 产生信号的方式在前面已经提到,简单来说可以归结为以下4点: 通过终端按键(组合键)产生信号 硬件异常产生的信号 调用系统函数向进程发信号 由软件条件产生信号 1.通过终端按键(组合键)产生信号: Core Dump:

关于linux c++守护进程调用调用system函数

匿名 (未验证) 提交于 2019-12-02 21:59:42
我们的程序是守护进程,也就是说在最开始会设置一些信号处理,比如说 ... signal ( SIGCHLD , SIG_IGN ); //忽略子进程结束的信号 ... 在这样的场景之下,我想实现这样的一个功能: 通过调用system函数来执行一些系统命令,并根据系统命令的返回值是不是0来判断命令是否执行成功(正常情况下调用system函数,执行成功 return 0; 执行失败 return 正数;)当我写下 int ret = system ( "ls -a" ); std : : cout << "call system ret=" << ret << std : : endl ; 时发现始终 ret = -1 查看errno发现errno=10(errno.10 is: No child processes) 进一步分析: system的实现大致是这样的: 1 )主进程 fork 一个子进程 2 )子进程调用 exec 函数去执行命令 3 )父进程调用 waitpid 来等来子进程结束 也就是说在调用waitpid的时候子进程退出,父进程收不到他的退出信号只发现这个进程不在了,所以有errno=10 ret = -1 具体原因: 当父进程未调用wait系列函数等待子进程结束且未显示忽略SIGCHLD信号,则子进程将成为僵尸进程。如果忽略SIGCHLD信号

Linux进程管理――转

匿名 (未验证) 提交于 2019-12-02 21:59:42
进程:是操作系统中的一种抽象概念,用来表示正在运行的程序 进程有多个属性参数:PID、PPID、UID、GID等 例子:手动创建一个 后台程序 ,并通过 kill 杀死它,前台程序可以Ctrl+C杀死 1.在主目录中用文本编辑器创建一个名为badpro的文本文件,包含如下内容: #! /bin/bash while echo "I'm making files!!!" do mkdir adir cd adir touch afile sleep 2s(不能忘,否则,必须使用rm -fr adir来删除这些“垃圾”目录) done 2.将这个文件加上可执行权限,并从后台执行。 chmod +x badpro ./badpro & (将命令放到一个工作队列中,可以用命令“jobs”查看) 3.程序运行起来了,运行ps命令查看这个程序的PID号(PID号用于唯一表示一个进程); ps aux | grep badpro ps 查看所有运行的程序 ps -aux ##可以看到所有运行的程序与 grep连用 ɸѡ ps -a ##显示现行终端机下的所有程序(包括其他用户的程序) ps -u ##以用户为主的排序显示(username) ps -x ##显示所有程序(包括所有终端机下的) 4.使用kill命令“杀死“这个进程。 kill 12794 ( PID ) ; 5

Linux 的各种 signal

匿名 (未验证) 提交于 2019-12-02 21:59:42
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。 和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。 由断点指令或其它trap指令产生. 由debugger使用。 调用abort函数生成的信号。 非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。 用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。 留给用户使用 留给用户使用 管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。 时钟定时信号,

linux下信号使用

匿名 (未验证) 提交于 2019-12-02 21:56:30
信号singal: 信号是一种软中断,在程序中每个信号用一个整数表示,为了记忆每个信号都有一个宏定义。 SIGKILL 9 进程终止信号 SIGSTOP 进程停止信号 SIGCONT 进程继续执行信号 SIGINT Ctrl+C发出信号,默认终止进程 SIGQUIT Ctrl+\发出信号,默认终止进程并产生Core文件 SIGTSTP Ctrl+Z发出信号,默认停止进程 SIGCHLD 子进程结束信号,默认忽略 SIGALRM 闹钟信号,闹钟定时时间到发出的信号,默认终止进程 自己处理信号: typedef void (*sighandler_t)(int); //信号处理函数指针,入参是当前处理信号值 sighandler_t signal(int signum, sighandler_t handler); //使用signal登记信号处理函数,返回原来的信号处理函数指针 signal(信号,SIG_IGN) //忽略信号 signal(信号,SIG_DFL) //恢复默认信号,返回SIG_ERR表示出错 自己处理的信号只能是可以捕获的信号,SIGKILL和SIGSTOP无法捕获。 kill -信号 进程id //用于发送指定信号到指定进程。 int kill(pid_t pid, int sig); //如果pid=0表示向本组的所有进程发送信号,如果sig=0不发信号

Linux-可重入函数(day10)

匿名 (未验证) 提交于 2019-12-02 21:56:30
Ŀ¼ 一、信号阻塞与信号未决 二、pause(2)的使用 三、信号传送过程处理 四、可重入函数 五、编写代码实现信号处理函数的继承 六、setitimer实现定时器 四、可重入函数   信号处理函数,尽量保证为可重入函数。 #include<stdio.h> #include<signal.h> #include<unistd.h> void doit(int n){ int v; static int c=0; v=c; v++; usleep(5000); c=v; printf("c=%d\n",c); return; } int main(void){ signal(2,doit); while(1){ doit(2); } return 0; }

Linux : C语言pause()函数:让进程暂停直到信号出现

匿名 (未验证) 提交于 2019-12-02 21:53:52
C语言pause()函数:让进程暂停直到信号出现 相关函数:kill, signal, sleep 头文件:#include <unistd.h> 定义函数:int pause(void); 函数说明:pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断. 返回值:只返回-1. 错误代码:EINTR 有信号到达中断了此函数. 转:https://blog.csdn.net/Lina_ACM/article/details/51992226