`
- 浏览:
329170 次
- 性别:
- 来自:
成都
-
SIGHUP信号与控制终端
UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。login shell是session首进程。
首先写一个测试程序,代码如下:
#include <stdio.h>
#include <signal.h>
char **args;
void exithandle(int sig)
{
printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉SIGHUP信号后打印一条信息,pause()使程序暂停。
编译后的执行文件为sigtest。
1、命 令:sigtest front > tt.txt
操 作:关闭终端
结 果:tt.txt文件的内容为front : sighup received
原 因: sigtest是前台进程,终端关闭后,根据上面提到的第1种情况,login shell作为session首进程,会收到SIGHUP信号然后退出。根据第2种情况,sigtest作为前台进程,会收到login shell发出的SIGHUP信号。
2、命 令:sigtest back > tt.txt &
操 作:关闭终端
结 果:tt.txt文件的内容为 back : sighup received
原 因: sigtest是提交的job,根据上面提到的第1种情况,sigtest会收到SIGHUP信号。
3、命 令:写一个shell,内容为[sigtest &],然后执行该shell
操 作:关闭终端
结 果:ps -ef | grep sigtest 会看到该进程还在,tt文件为空
原 因: 执行该shell时,sigtest作为job提交,然后该shell退出,致使sigtest变成了孤儿进程,不再是当前session的job了,因此sigtest即不是session首进程也不是job,不会收到SIGHUP。同时孤儿进程属于后台进程,因此login shell退出后不会发送SIGHUP给sigtest,因为它只将该信号发送给前台进程。第3条说过若进程组变成孤儿进程组的时候,若有进程处于停止状态,也会收到SIGHUP信号,但sigtest没有处于停止状态,所以不会收到SIGHUP信号。
4、命 令:nohup sigtest > tt
操 作:关闭终端
结 果:tt文件为空
原 因: nohup可以防止进程收到SIGHUP信号
至此,我们就清楚了何种情况下终端关闭后进程会退出,何种情况下不会退出。
要想终端关闭后进程不退出有以下几种方法,均为通过shell的方式:
1、编写shell,内容如下
trap "" SIGHUP #该句的作用是屏蔽SIGHUP信号,trap可以屏蔽很多信号
sigtest
2、nohup sigtest 可以直接在命令行执行,
若想做完该操作后继续别的操作,可以 nohup sigtest &
3、编写shell,内容如下
sigtest &
其实任何将进程变为孤儿进程的方式都可以,包括fork后父进程马上退出。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
SIGHUP信号是在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一Session内的各个作业,这时它们与控制终端不再关联。登录Linux时,系统会分配给登录用户一个终端(Session)。在这...
当用户退出Linux登录时,前台进程组和后台有终端输出的进程将会收到SIGHUP信号。 2. SIGINT:程序终止(interrupt)信号,在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。 3. SIGQUIT:和...
SIGHUP信号是发送给控制进程的一个特殊信号,通常在控制终端被关闭时产生。在传统的UNIX系统中,这个信号会终止所有属于该终端的后台进程,但在现代系统中,这个信号通常被用来重新加载配置文件或通知进程环境变化。...
例如,当用户退出登录会话时,所有与该会话关联的进程都将收到SIGHUP信号。 2. **SIGINT (2)**:中断信号,通常通过按下`Ctrl+C`触发,用于终止前台运行的进程。 3. **SIGQUIT (3)**:类似于SIGINT,但通过按下`...
- **SIGHUP**:当终端连接结束时发送,通常是因为控制终端的进程结束。 - **SIGTERM**:用于请求进程正常退出。 2. **与进程异常事件相关的信号**:此类信号与硬件错误或非法操作有关。 - **SIGINT**:中断信号...
除此之外,还有一些信号虽然不在POSIX.1标准中,但在SUSv2中定义,例如SIGBUS(10/7/10)、SIGPOLL(与SIGIO同义)、SIGPROF(27/27/29)、SIGSYS(12)以及SIGTRAP(5)等。 信号处理是操作系统中一个重要的组成...
1) SIGHUP(挂断信号):当用户终端连接结束,例如用户退出登录时,SIGHUP信号会被发送给同一session内的所有进程,提示它们与控制终端断开。默认情况下,进程会终止,但可以被捕获并忽略,如wget在接收到SIGHUP时...
SIGHUP的默认操作是终止进程,特别是那些与控制终端相关的进程。然而,一些程序如`wget`可以通过捕获并忽略SIGHUP信号来保持运行,即使用户已退出终端。 2. **SIGINT(中断)**:当用户按下Ctrl+C时,系统发送...
| `SIGTSTP` | 18,20,24 | D | 控制终端(tty)上按下停止键 | | `SIGTTIN` | 21,21,26 | D | 后台进程企图从控制终端读 | | `SIGTTOU` | 22,22,27 | D | 后台进程企图从控制终端写 | #### 七、信号的高级特性 ...
- **用户交互**:`SIGINT`(键盘中断,通常是Ctrl+C)和`SIGHUP`(挂断信号,例如终端关闭)。 - **跟踪与调试**:`SIGTRAP`,用于调试目的。 - **用户自定义**:`SIGUSR1`和`SIGUSR2`,供程序员定义特殊事件。 ...
这两个信号分别在后台进程试图从控制终端读取输入或向控制终端写入输出时触发。这些信号通常用于防止后台进程占用前台会话,从而保持终端的交互性。 #### SIGURG(紧急数据信号) 当套接字上有带外数据可用时发送...
首先,SIGHUP信号是一种UNIX信号,通常被用于控制终端挂起时通知守护进程(daemon)。但在这里,Huptime利用该信号作为用户手动控制重启的触发点,当目标进程接收到SIGHUP信号后,就会启动重启机制。 SO_REUSEPORT...
1. **SIGHUP**:挂起(HangUp)信号,当用户终端连接结束时发出。例如,当用户注销或关闭终端时,所有与该终端关联的进程都会接收到此信号。 2. **SIGINT**:中断(Interrupt)信号,当用户键入INTR字符(通常是Ctrl+C...
| SIGHUP | 控制终端或进程上挂起或非正常终止 | 终止 | | SIGILL | 无效的硬件指令 | 终止 | | SIGINT | 交互终端提示信号(通常是Ctrl-C) | 终止 | | SIGKILL | 终止(不能被捕获或忽略) | 终止 | | SIGPIPE | 向一...
- `SIGHUP`: 终端挂起或控制进程终止。 - `SIGINT`: 用户中断请求(通常由Ctrl+C产生)。 - `SIGQUIT`: 用户退出请求(通常由Ctrl+\产生)。 - `SIGILL`: 非法指令。 - `SIGTRAP`: 跟踪陷阱。 - `SIGABRT`: 异常终止...
- **定义**:当终端会话结束时发出此信号,通常发生在控制进程终止的情况下,用于通知同一个会话中的其他进程与终端的连接已断开。 - **用途**:用于告知所有会话成员与终端连接已中断;对于守护进程而言,此信号可...
* 与终端交互相关的信号。 * 跟踪进程执行的信号。 Linux支持的信号列表包括: * SIGHUP * SIGINT * SIGQUIT * SIGILL * SIGABRT * SIGFPE * SIGKILL * SIGSEGV * SIGPIPE * SIGALRM * SIGTERM * SIGUSR1 * SIGUSR...
| SIGTTOU | 22/22/27 | D | 后台进程企图从控制终端写入 | 另外还有一些在POSIX.1标准中未列出但在SUSv2中列出的信号,如: - **SIGBUS**:10/7/10,C,总线错误(内存访问) - **SIGPOLL**:A,SysV定义的可轮询...
22. **`SIGTTOU` (22)**:后台进程试图向控制终端写入数据时发送的信号。 23. **`SIGURG` (23)**:紧急数据可用信号,当套接字有紧急数据时发送。 24. **`SIGXCPU` (24)**:CPU时间限制超出信号,当进程消耗的CPU...