linux signal()函数
linux中的signal机制

Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX.1中列出的信号:
信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
break;
case 2:
printf("Get a signal -- SIGINT ");
break;
(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。
下面是其它的一些信号
信号 值 处理动作 发出信号的原因
(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
收 到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
注册信号处理函数

注册信号处理函数一、概述在Linux系统中,信号是一种软件中断,它用于通知进程发生了某个事件。
当进程收到信号时,会执行预先注册的信号处理函数。
本文将介绍如何注册信号处理函数。
二、信号的基本概念1. 信号的种类Linux系统中有多种不同的信号,每种信号都有一个唯一的编号。
其中比较常用的信号包括:- SIGINT:程序终止(例如:Ctrl+C)- SIGTERM:程序结束(例如:kill命令)- SIGKILL:强制终止程序(不能被阻塞或忽略)- SIGSTOP:暂停进程- SIGCONT:恢复进程2. 信号处理方式当进程收到一个信号时,可以采取以下三种方式进行处理:- 忽略该信号- 执行默认操作- 执行自定义操作(即注册一个信号处理函数)3. 信号处理函数当进程收到一个需要自定义操作的信号时,需要先注册一个对应的信号处理函数。
该函数会在接收到该类型的信号时被调用,并执行相应操作。
三、如何注册信号处理函数1. signal()函数signal()是最早出现的注册信号处理函数的方法之一。
它定义在头文件<signal.h>中,其原型如下:```cvoid (*signal(int signum, void (*handler)(int)))(int);```其中,signum表示要处理的信号编号,handler是一个指向信号处理函数的指针。
例如,我们可以定义一个SIGINT信号处理函数如下:```cvoid sigint_handler(int signo){printf("Received SIGINT signal!\n");}int main(){signal(SIGINT, sigint_handler);while(1){// do something}return 0;}```上述代码中,我们首先定义了一个名为sigint_handler的函数,用于处理SIGINT信号。
Linux下signal信号汇总

Linux下signal信号汇总SIGHUP 1/* Hangup (POSIX). */终⽌进程终端线路挂断SIGINT 2/* Interrupt (ANSI). */终⽌进程中断进程 Ctrl+CSIGQUIT 3/* Quit (POSIX). */建⽴CORE⽂件终⽌进程,并且⽣成core⽂件 Ctrl+\SIGILL 4/* Illegal instruction (ANSI). */建⽴CORE⽂件,⾮法指令SIGTRAP 5/* Trace trap (POSIX). */建⽴CORE⽂件,跟踪⾃陷SIGABRT 6/* Abort (ANSI). */SIGIOT 6/* IOT trap (4.2 BSD). */建⽴CORE⽂件,执⾏I/O⾃陷SIGBUS 7/* BUS error (4.2 BSD). */建⽴CORE⽂件,总线错误SIGFPE 8/* Floating-point exception (ANSI). */建⽴CORE⽂件,浮点异常SIGKILL 9/* Kill, unblockable (POSIX). */终⽌进程杀死进程SIGUSR1 10/* User-defined signal 1 (POSIX). */终⽌进程⽤户定义信号1SIGSEGV 11/* Segmentation violation (ANSI). */建⽴CORE⽂件,段⾮法错误SIGUSR2 12/* User-defined signal 2 (POSIX). */终⽌进程⽤户定义信号2SIGPIPE 13/* Broken pipe (POSIX). */终⽌进程向⼀个没有读进程的管道写数据SIGALARM 14/* Alarm clock (POSIX). */终⽌进程计时器到时SIGTERM 15/* Termination (ANSI). */终⽌进程软件终⽌信号SIGSTKFLT 16/* Stack fault. */SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */SIGCHLD 17/* Child status has changed (POSIX). */忽略信号当⼦进程停⽌或退出时通知⽗进程SIGCONT 18/* Continue (POSIX). */忽略信号继续执⾏⼀个停⽌的进程SIGSTOP 19/* Stop, unblockable (POSIX). */停⽌进程⾮终端来的停⽌信号SIGTSTP 20/* Keyboard stop (POSIX). */停⽌进程终端来的停⽌信号 Ctrl+ZSIGTTIN 21/* Background read from tty (POSIX). */停⽌进程后台进程读终端SIGTTOU 22/* Background write to tty (POSIX). */停⽌进程后台进程写终端SIGURG 23/* Urgent condition on socket (4.2 BSD). */忽略信号 I/O紧急信号SIGXCPU 24/* CPU limit exceeded (4.2 BSD). */终⽌进程 CPU时限超时SIGXFSZ 25/* File size limit exceeded (4.2 BSD). */终⽌进程⽂件长度过长SIGVTALRM 26/* Virtual alarm clock (4.2 BSD). */终⽌进程虚拟计时器到时SIGPROF 27/* Profiling alarm clock (4.2 BSD). */终⽌进程统计分布图⽤计时器到时SIGWINCH 28/* Window size change (4.3 BSD, Sun). */忽略信号窗⼝⼤⼩发⽣变化SIGPOLL SIGIO /* Pollable event occurred (System V). */SIGIO 29/* I/O now possible (4.2 BSD). */忽略信号描述符上可以进⾏I/OSIGPWR 30/* Power failure restart (System V). */SIGSYS 31/* Bad system call. */SIGUNUSED 311) SIGHUP本信号在⽤户终端连接(正常或⾮正常)结束时发出, 通常是在终端的控制进程结束时, 通知同⼀session内的各个作业, 这时它们与控制终端不再关联.2) SIGINT程序终⽌(interrupt)信号, 在⽤户键⼊INTR字符(通常是Ctrl+C)时发出3) SIGQUIT和 SIGINT类似, 但由QUIT字符(通常是Ctrl+\)来控制. 进程在因收到 SIGQUIT 退出时会产⽣core⽂件, 在这个意义上类似于⼀个程序错误信号.4) SIGILL执⾏了⾮法指令. 通常是因为可执⾏⽂件本⾝出现错误, 或者试图执⾏数据段. 堆栈溢出时也有可能产⽣这个信号.5) SIGTRAP由断点指令或其它trap指令产⽣. 由debugger使⽤.6) SIGABRT程序⾃⼰发现错误并调⽤abort时产⽣.6) SIGIOT在PDP-11上由iot指令产⽣, 在其它机器上和SIGABRT⼀样.7) SIGBUS⾮法地址, 包括内存地址对齐(alignment)出错. eg: 访问⼀个四个字长的整数, 但其地址不是4的倍数.8) SIGFPE在发⽣致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.9) SIGKILL⽤来⽴即结束程序的运⾏. 本信号不能被阻塞, 处理和忽略.10) SIGUSR1留给⽤户使⽤11) SIGSEGV试图访问未分配给⾃⼰的内存, 或试图往没有写权限的内存地址写数据.12) SIGUSR2留给⽤户使⽤13) SIGPIPE Broken pipe14) SIGALRM时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使⽤该信号.15) SIGTERM程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常⽤来要求程序⾃⼰正常退出. shell命令kill缺省产⽣这个信号.17) SIGCHLD⼦进程结束时, ⽗进程会收到这个信号.18) SIGCONT让⼀个停⽌(stopped)的进程继续执⾏. 本信号不能被阻塞. 可以⽤⼀个handler来让程序在由stopped状态变为继续执⾏时完成特定的⼯作. 例如,重新显⽰提⽰符19) SIGSTOP停⽌(stopped)进程的执⾏. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执⾏. 本信号不能被阻塞, 处理或忽略.20) SIGTSTP停⽌进程的运⾏, 但该信号可以被处理和忽略. ⽤户键⼊SUSP字符时(通常是Ctrl+Z)发出这个信号21) SIGTTIN当后台作业要从⽤户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停⽌执⾏.22) SIGTTOU类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.23) SIGURG有"紧急"数据或out-of-band数据到达socket时产⽣.24) SIGXCPU超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变25) SIGXFSZ超过⽂件⼤⼩资源限制.26) SIGVTALRM虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占⽤的CPU时间.27) SIGPROF类似于SIGALRM/SIGVTALRM, 但包括该进程⽤的CPU时间以及系统调⽤的时间.28) SIGWINCH窗⼝⼤⼩改变时发出.29) SIGIO⽂件描述符准备就绪, 可以开始进⾏输⼊/输出操作.30) SIGPWR Power failure有两个信号可以停⽌进程:SIGTERM和SIGKILL。
linux信号处理四(sigaction参数说明)

linux信号处理四(sigaction参数说明)sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接⼝,⽽signal()是标准C的信号接⼝(如果程序必须在⾮POSIX系统上运⾏,那么就应该使⽤这个接⼝)给信号signum设置新的信号处理函数act,同时保留该信号原有的信号处理函数oldactint sigaction(int signo,const struct sigaction *restrict act,struct sigaction *restrict oact);第⼆、第三个参数为,sigaction结构类型定义如下:struct sigaction{void (*sa_handler)(int);sigset_t sa_mask;int sa_flag;void (*sa_sigaction)(int,siginfo_t *,void *);};sa_handler:字段包含⼀个信号捕捉函数的地址sa_mask:字段说明了⼀个信号集,在调⽤该信号捕捉函数之前,这⼀信号集要加进进程的信号屏蔽字中。
即执⾏信号处理函数期间,阻塞信号屏蔽字中的信号,执⾏结束后再处理这期间发⽣的信号(sa_mask集中的信号)。
注:阻塞的意思是延迟相应信号sa_flag :是⼀个选项,注意:这个选项只与sigaction函数注册的信号有关联,与sa_mask中的信号⽆任何关系。
SA_INTERRUPT 由此信号中断的系统调⽤不会⾃动重启SA_RESTART 由此信号中断的系统调⽤会⾃动重启SA_SIGINFO 提供附加信息,⼀个指向siginfo结构的指针以及⼀个指向进程上下⽂标识符的指针SA_NODEFER ⼀般情况下,当信号处理函数运⾏时,内核将阻塞(sigaction函数注册时的信号)。
但是如果设置了SA_NODEFER标记,那么在该信号处理函 数运⾏时,内核将不会阻塞该信号。
Linux信号(signal)机制分析

Linux信号(signal)机制分析【摘要】本⽂分析了Linux内核对于信号的实现机制和应⽤层的相关处理。
⾸先介绍了软中断信号的本质及信号的两种不同分类⽅法尤其是不可靠信号的原理。
接着分析了内核对于信号的处理流程包括信号的触发/注册/执⾏及注销等。
最后介绍了应⽤层的相关处理,主要包括信号处理函数的安装、信号的发送、屏蔽阻塞等,最后给了⼏个简单的应⽤实例。
【关键字】软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t1 信号本质软中断信号(signal,⼜简称为信号)⽤来通知进程发⽣了异步事件。
在软件层次上是对中断机制的⼀种模拟,在原理上,⼀个进程收到⼀个信号与处理器收到⼀个中断请求可以说是⼀样的。
信号是进程间通信机制中唯⼀的异步通信机制,⼀个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
进程之间可以互相通过系统调⽤kill发送软中断信号。
内核也可以因为内部事件⽽给进程发送信号,通知进程发⽣了某个事件。
信号机制除了基本通知功能外,还可以传递附加信息。
收到信号的进程对各种信号有不同的处理⽅法。
处理⽅法可以分为三类:第⼀种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
第⼆种⽅法是,忽略某个信号,对该信号不做任何处理,就象未发⽣过⼀样。
第三种⽅法是,对该信号的处理保留系统的默认值,这种缺省操作,对⼤部分的信号的缺省操作是使得进程终⽌。
进程通过系统调⽤signal 来指定进程对某个信号的处理⾏为。
2 信号的种类可以从两个不同的分类⾓度对信号进⾏分类:可靠性⽅⾯:可靠信号与不可靠信号;与时间的关系上:实时信号与⾮实时信号。
2.1 可靠信号与不可靠信号Linux信号机制基本上是从Unix系统中继承过来的。
早期Unix系统中的信号机制⽐较简单和原始,信号值⼩于SIGRTMIN的信号都是不可靠信号。
linux signal使用

Linux 中的signal 函数用于处理进程接收到的信号。
signal 函数有两个参数:sig 和func。
sig 参数表示将要处理哪种类型的信号,而func 参数是一个函数指针,用来指定信号的处理函数。
当进程接收到sig 那个类型的信号后,就会调用func 指针指向的函数。
以下是linux signal 使用的详细步骤:1. 包含头文件:在使用signal 函数之前,需要包含相应的头文件。
在C 语言中,需要包含`signal.h`头文件。
2. 定义信号处理函数:需要定义一个函数,用于处理接收到的信号。
这个函数的原型通常为`void (*func)(int)`,其中int 类型的参数表示信号的整数值。
3. 调用signal 函数:使用signal 函数设置信号处理函数。
signal 函数的调用格式为`signal(sig, func)`,其中sig 表示要处理的信号类型,func 表示信号处理函数的函数指针。
4. 编写主程序:在主程序中,使用`while`或`for`循环等方法,等待信号的到来。
当接收到信号时,程序会自动调用已设置的信号处理函数。
5. 处理信号:在信号处理函数中,根据信号类型和需求,进行相应的处理。
例如,当接收到SIGINT(Ctrl+C)信号时,可以执行退出程序的操作。
6. 释放资源:在程序结束时,使用`sigaction`函数撤销信号处理函数的设置,以释放资源。
以下是一个简单的示例,演示了如何在Linux 中使用signal 函数处理SIGINT 信号(Ctrl+C):```c#include <stdio.h>#include <signal.h>#include <unistd.h>void signal_handler(int signum) {printf("接收到信号%d\n",signum);}int main() {signal(SIGINT, signal_handler);while (1) {printf("等待信号...\n");sleep(1);}return 0;}```在这个示例中,我们设置了SIGINT 信号的处理函数为`signal_handler`。
linux 默认sigsegv处理函数
linux 默认sigsegv处理函数在Linux中,默认的SIGSEGV(段错误)处理函数是通过信号处理机制来实现的。
当程序出现段错误时,操作系统会向进程发送SIGSEGV信号,进程会捕获该信号并执行相应的处理函数。
在Linux中,默认的SIGSEGV处理函数是`sigsegv_handler`,它会打印出有关错误的一些信息,如错误的内存地址,引起段错误的指令等。
同时,它还会终止程序的执行。
在C/C++中,可以自定义SIGSEGV处理函数。
例如,可以使用`signal`函数来注册一个自定义的SIGSEGV处理函数,如下所示:c#include <stdio.h>#include <signal.h>void sigsegv_handler(int signal){printf("Segmentation fault\n");执行一些自定义的处理逻辑...}int main(){注册SIGSEGV处理函数signal(SIGSEGV, sigsegv_handler);产生一个段错误int *p = NULL;*p = 10;return 0;}在上面的示例中,当程序产生段错误时,`sigsegv_handler`函数会被调用,并打印出"Segmentation fault"。
可以根据实际需要,在自定义的SIGSEGV处理函数中执行一些特定的逻辑。
需要注意的是,如果在SIGSEGV处理函数中通过非局部跳转(如`longjmp`)来返回到程序的主流程,可能会导致程序处于未定义的状态。
因此,一般不建议在SIGSEGV处理函数中执行非局部跳转。
最好的方式是在SIGSEGV处理函数中打印出有用的信息,并终止程序的执行。
linux sigterm信号用法
linux sigterm信号用法在Linux 中,`SIGTERM` 是一种用于终止进程的信号。
当系统管理员或其他进程希望优雅地终止一个运行中的进程时,常常会发送`SIGTERM` 信号。
相对于强制终止信号`SIGKILL`,`SIGTERM` 信号允许进程有机会在接收到信号时完成清理工作。
以下是使用`SIGTERM` 信号的一些常见用法:1. 手动发送`SIGTERM` 信号:```bashkill -15 <PID>```或者更简洁地:```bashkill -TERM <PID>```这会向进程发送`SIGTERM` 信号,其中`<PID>` 是目标进程的进程标识符。
2. 在脚本中使用`kill` 命令:在脚本中,可以使用`kill` 命令发送`SIGTERM` 信号,如下所示:```bash#!/bin/bash# 获取进程PIDPID=$(pidof your_process_name)# 发送SIGTERM信号kill -TERM $PID```3. 处理`SIGTERM` 信号的进程:在编写应用程序时,可以捕获`SIGTERM` 信号,并在接收到信号时执行清理操作。
例如,在使用C 语言编写的程序中,可以使用信号处理函数来处理`SIGTERM` 信号:```c#include <stdio.h>#include <signal.h>#include <unistd.h>void sigterm_handler(int signo) {printf("Received SIGTERM signal. Cleaning up...\n");// 执行清理操作// ...exit(EXIT_SUCCESS);}int main() {// 注册SIGTERM信号处理函数signal(SIGTERM, sigterm_handler);// 业务逻辑while (1) {// ...sleep(1);}return 0;}```在上述示例中,当进程接收到`SIGTERM` 信号时,会执行`sigterm_handler` 函数来进行清理操作,然后正常退出程序。
linux sigill代码
linux sigill代码1.引言1.1 概述Linux操作系统是一种广泛使用的开源操作系统,它具有强大的性能和灵活的设计。
在Linux操作系统中,SIGILL是一个重要的代码,它代表着非法指令(illegal instruction)的意思。
SIGILL代码对于理解和分析程序的运行过程具有重要意义。
当程序执行到一个非法指令时,操作系统会发送一个SIGILL信号给程序,以通知它出现了错误。
这个信号的处理可以由程序自行定义,通常情况下,程序会终止执行并报告错误。
SIGILL代码的含义是非常灵活的。
它可以用于检测代码中的错误、优化代码执行效率,或者实现一些特定的功能。
通过对SIGILL代码的分析,我们可以发现程序中潜在的问题或者优化的空间,从而提升程序的性能和稳定性。
然而,SIGILL代码也存在一定的局限性。
首先,由于它是在程序运行过程中触发的,因此对程序的性能会有一定的影响。
其次,在某些情况下,由于代码中使用了一些特殊的指令或者不可执行的操作,导致程序产生了非法指令的情况,这可能会误判为程序存在问题。
因此,在使用SIGILL 代码时,需要谨慎处理,并结合其他方法进行综合分析。
总之,SIGILL代码在Linux操作系统中具有重要的作用。
通过对SIGILL 代码的深入理解和应用,我们可以更好地开发和优化程序,提升系统的性能和稳定性。
在本文接下来的章节中,我们将详细介绍Linux操作系统以及SIGILL代码的含义和应用。
1.2文章结构文章结构部分的内容可以包括以下内容:在本文中,将会按照以下结构展开对Linux SIGILL代码的探讨:2.正文:2.1 Linux操作系统简介:本节将从Linux操作系统的发展历程、基本特性等方面进行介绍,以帮助读者对Linux操作系统有一个基本的了解。
2.2 SIGILL代码的含义:本节将着重探讨SIGILL代码的含义及其在Linux操作系统中的作用。
将会介绍SIGILL代码的定义、产生方式以及它在操作系统中的具体应用场景。
linux system系列函数
linux system系列函数Linux(GNU/Linux)是一种开源的操作系统,它有许多常用的系统函数,用于操作文件、进程、网络等。
下面将介绍一些常用的Linux 系统函数。
1.文件操作函数:- open():用于打开一个文件,可以指定文件名、打开模式等参数。
- close():关闭一个已打开的文件。
- read():从文件中读取数据。
- write():向文件中写入数据。
- lseek():移动文件指针的位置。
- stat():获取文件的状态信息。
- mkdir():创建一个新的目录。
- rmdir():删除一个空的目录。
- unlink():删除一个文件。
- rename():重命名一个文件。
2.进程操作函数:- fork():创建一个新的进程。
- exec():执行一个新的程序。
- wait():等待子进程结束。
- exit():终止当前进程。
- getpid():获取当前进程的ID。
- kill():向指定进程发送信号。
- nice():调整当前进程的优先级。
- signal():设置信号处理器。
3.网络操作函数:- socket():创建一个网络套接字。
- bind():将套接字与特定的IP地址和端口绑定。
- listen():开始监听指定套接字上的连接请求。
- accept():接受一个到来的连接请求。
- connect():发起一个连接请求。
- read():从套接字中读取数据。
- write():向套接字中写入数据。
- close():关闭一个已经打开的套接字。
4.线程操作函数:- pthread_create():创建一个新的线程。
- pthread_join():等待指定的线程结束。
- pthread_detach():将一个线程设置为分离状态。
- pthread_exit():终止当前线程。
- pthread_mutex_lock():加锁一个互斥量。
- pthread_mutex_unlock():解锁一个互斥量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当服务器close一个连接时,若client端接着发数据。
根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出), 所以client会退出。
若不想客户端退出可以把SIGPIPE设为SIG_IGN
如: signal(SIGPIPE,SIG_IGN);
这时SIGPIPE交给了系统处理。
服务器采用了fork的话,要收集垃圾进程,防止僵死进程的产生,可以这样处理:
signal(SIGCHLD,SIG_IGN);交给系统init去回收。
这里子进程就不会产生僵死进程了。
signal(SIGHUP, SIG_IGN);
signal信号函数,第一个参数表示需要处理的信号值(SIGHUP),第二个参数为处理函数或者是一个表示,这里,SIG_IGN表示忽略SIGHUP那个注册的信号。
SIGHUP和控制台操作有关,当控制台被关闭时系统会向拥有控制台sessionID的所有进程发送HUP信号,默认HUP信号的action是exit,如果远程登陆启动某个服务进程并在程序运行时关闭连接的话会导致服务进程退出,所以一般服务进程都会用nohup工具启动或写成一个daemon。
unix中进程组织结构为session 包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。
一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。
一个进程组可能会有一个进程组首进程。
进程组首进程的进程ID与该进程组ID相等。
这儿是可能会有,在一定情况之下是没有的。
与终端交互的进程是前台进程,否则便是后台进程
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用&符号提交的进程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。
所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
表头文件 #include<signal.h>
功能:
设置某一信号的对应动作
函数原型:
void (*signal(int signum,void(* handler)(int)))(int);
或者:typedef void(*sig_t) ( int ); sig_t signal(int signum,sig_t handler);
参数说明:
第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。
第二个参数handler描述了与信号关联的动作,它可以取以下三种值:
(1)一个返回值为正数的函数地址此函数必须在signal()被调用前申明,handler中为这个函数的名字。
当接收到一个类型为sig的信号时,就执行handler 所指定的函数。
这个函数应有如下形式的定义:intfunc(int sig); sig是传递给它的唯一参数。
执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。
当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。
(2)SIGIGN 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。
(3)SIGDFL 这个符号表示恢复系统对信号的默认处理。
函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数。
当指定的信号到达时就会跳转到参数handler指定的函数执行。
当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。
但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。
返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。
附加说明:在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。
下面的情况可以产生Signal:
1. 按下CTRL+C产生SIGINT
2. 硬件中断,如除0,非法内存访问(SIGSEV)等等
3. Kill函数可以对进程发送Signal
4. Kill命令。
实际上是对Kill函数的一个包装
5. 软件中断。
如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据
(SIGPIPE),等等2 Signals:
1、不要使用低级的或者STDIO.H的IO函数
2、不要使用对操作
3、不要进行系统调用
4、不是浮点信号的时候不要用longjmp
5、singal函数是由ISO C定义的。
因为ISO C不涉及多进程,进程组以及终端I/O等,所以他对信号的定义非常含糊,以至于对UNIX系统而言几乎毫无用处。
备注:因为singal的语义于现实有关,所以最好使用sigaction函数替代本函数。