当前位置: 技术问答>linux和unix
Linux下的信号忽略和信号阻塞是什么意思
来源: 互联网 发布时间:2015-11-20
本文导语: 麻烦大侠把处理流程说清楚一点. | 忽略就是不对这个或者这些信号进行任何操作,方法之一有: signal(signo,SIG_IGN ) 堵塞就是先不做处理! sigprocmask + SIG_BLOCK sigprocmask + SIG_UNBLOCK(解...
麻烦大侠把处理流程说清楚一点.
|
忽略就是不对这个或者这些信号进行任何操作,方法之一有:
signal(signo,SIG_IGN )
堵塞就是先不做处理!
sigprocmask + SIG_BLOCK
sigprocmask + SIG_UNBLOCK(解除堵塞)
signal(signo,SIG_IGN )
堵塞就是先不做处理!
sigprocmask + SIG_BLOCK
sigprocmask + SIG_UNBLOCK(解除堵塞)
|
让系统自动来收拾!!
结贴吧!!LZ
结贴吧!!LZ
|
the sighold function shall add sig to the calling peocess's sinal mask.
有sighold
SIGCHLD Ign Child stopped or terminated
常数SIG_IGN,表示忽略信号
下面的是我转的
Linux下的c语言网络编程--将普通进程转换为守护进程
c 作者 javaSky @ 2005-05-10 10:49:15
信号处理。一般要忽略掉某些信号。信号相当于软件中断,Linux/Unix下的信号机制提供了一种处理异步事件的方法,终端用户键入引发中断的键,或是系统发出信号,这都会通过信号处理机制终止一个或多个程序的运行。
不同情况下引发的信号不同,所有的信号都有自己的名字,这些名字都是以“SIG”开头的,只是后面有所不同。我们可以通过这些名字了解到系统中到底发生了什么事。当信号出现时,我们可以要求系统进行一下三种操作:
a、忽略信号。大多数信号都采用这种处理方法,但是对SIGKILL和SIGSTOP信号不能做忽略处理。
b、捕捉信号。这是一种最为灵活的操作方式。这种处理方式的意思就是:当某种信号发生时,我们可以调用一个函数对这种情况进行响应的处理。最常见的情况是:如果捕捉到SIGCHID信号,则表示子进程已经终止,然后可作此信号的捕捉函数中调用waitpid()函数取得该子进程的进程ID已经他的终止状态。如果进程创建了临时文件,那么就要为进程终止信号SIGTERM编写一个信号捕捉函数来清除这些临时文件。
c、执行系统的默认动作。对绝大多数信号而言,系统的默认动作都是终止该进程。
在Linux下,信号有很多种,我在这里就不一一介绍了,如果想详细地对这些信号进行了解,可以查看头文件,这些信号都被定义为正整数,也就是它们的信号编号。在对信号进行处理时,必须要用到函数signal(),此函数的详细描述为:
-----------------------------------------------------------------
#include
void (*signal (int signo, void (*func)(int)))(int);
-----------------------------------------------------------------
其中参数signo为信号名,参数func的值根据我们的需要可以是以下几种情况:(1)常数SIG_DFL,表示执行系统的默认动作。(2)常数SIG_IGN,表示忽略信号。(3)收到信号后需要调用的处理函数的地址,此信号捕捉程序应该有一个整型参数但是没有返回值。signal()函数返回一个函数指针,而该指针指向的函数应该无返回值(void),这个指针其实指向以前的信号捕捉程序。
下面 回到我们的daemonize()函数上来。这个函数在创建守护进程时忽略了三个信号:
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
这三个信号的含义分别是:SIGTTOU表示后台进程写控制终端,SIGTTIN表示后台进程读控制终端,SIGTSTP表示终端挂起。
有sighold
SIGCHLD Ign Child stopped or terminated
常数SIG_IGN,表示忽略信号
下面的是我转的
Linux下的c语言网络编程--将普通进程转换为守护进程
c 作者 javaSky @ 2005-05-10 10:49:15
信号处理。一般要忽略掉某些信号。信号相当于软件中断,Linux/Unix下的信号机制提供了一种处理异步事件的方法,终端用户键入引发中断的键,或是系统发出信号,这都会通过信号处理机制终止一个或多个程序的运行。
不同情况下引发的信号不同,所有的信号都有自己的名字,这些名字都是以“SIG”开头的,只是后面有所不同。我们可以通过这些名字了解到系统中到底发生了什么事。当信号出现时,我们可以要求系统进行一下三种操作:
a、忽略信号。大多数信号都采用这种处理方法,但是对SIGKILL和SIGSTOP信号不能做忽略处理。
b、捕捉信号。这是一种最为灵活的操作方式。这种处理方式的意思就是:当某种信号发生时,我们可以调用一个函数对这种情况进行响应的处理。最常见的情况是:如果捕捉到SIGCHID信号,则表示子进程已经终止,然后可作此信号的捕捉函数中调用waitpid()函数取得该子进程的进程ID已经他的终止状态。如果进程创建了临时文件,那么就要为进程终止信号SIGTERM编写一个信号捕捉函数来清除这些临时文件。
c、执行系统的默认动作。对绝大多数信号而言,系统的默认动作都是终止该进程。
在Linux下,信号有很多种,我在这里就不一一介绍了,如果想详细地对这些信号进行了解,可以查看头文件,这些信号都被定义为正整数,也就是它们的信号编号。在对信号进行处理时,必须要用到函数signal(),此函数的详细描述为:
-----------------------------------------------------------------
#include
void (*signal (int signo, void (*func)(int)))(int);
-----------------------------------------------------------------
其中参数signo为信号名,参数func的值根据我们的需要可以是以下几种情况:(1)常数SIG_DFL,表示执行系统的默认动作。(2)常数SIG_IGN,表示忽略信号。(3)收到信号后需要调用的处理函数的地址,此信号捕捉程序应该有一个整型参数但是没有返回值。signal()函数返回一个函数指针,而该指针指向的函数应该无返回值(void),这个指针其实指向以前的信号捕捉程序。
下面 回到我们的daemonize()函数上来。这个函数在创建守护进程时忽略了三个信号:
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
这三个信号的含义分别是:SIGTTOU表示后台进程写控制终端,SIGTTIN表示后台进程读控制终端,SIGTSTP表示终端挂起。