SIGHUP:
SIGHUP信号在如下情况下会发生:
1. 控制终端关闭,此时会发送SIGHUP给会发送给session首进程以及几个后台进程组;
2. session首进程退出,此时会发送给前端进程组的每一个进程;
3.如果进程组的首进程推出,该进程组成为孤儿进程组,并且进程组中有进程处于停止状态(如发送SIGSTOP或者SIGTSTP),则先发送SIGHUP,再发送SIGCONT 通常情况下,系统对SIGHUP的默认动作是关闭进程,若想不关闭则需要对SIGHUP信号进程信号函数处理,或者视为之SIG_IGNSIGCHLD和SIGCLD: 这个信号是当子进程结束后发送给父进程的,默认动作是忽略它,此时子进程会成为僵尸进程!SIGCLD是SIGCHLD的老名字。
(区别僵尸进程和孤儿进程以及孤儿进程组:
1. 僵尸进程是子进程结束,但是父进程没有对它进行waitpid;
2. 孤儿进程是父进程结束,子进程继续执行,但是被init进程收养,则变为孤儿进程
3. 孤儿进程组是指一个进程组中的所有进程,或者父进程在本进程组中;或者父进程在所在的session之外
)
SIGCONT:
你可以发送一个SIGCONT信号给一个进程。如果这个进程之前被停止了,则进程继续;否则它什么也不做。并且呢,这个信号是不可以被sigprocmask或者pthread_sigmask进行阻塞的。
SIGSTOP和SIGTSTP:
SIGSTOP是使得某个进程停止,但是该信号不可以被处理(handled),忽略或者阻塞。如果你有这些需求,请使用SIGTSTP
SIGTTIN:
当一个进程是后台进程的时候,它是不能够从用户的控制终端进行读取的。任何试图从终端读取的后端进程都会被发送一个SIGTTIN的信号。这个信号的默认行为是停止当前进程。
SIGTTOUT:
与SIGTTIN基本相同,除了这里是输出,SIGTIIN是输入。
SIGHUP信号在如下情况下会发生:
1. 控制终端关闭,此时会发送SIGHUP给会发送给session首进程以及几个后台进程组;
2. session首进程退出,此时会发送给前端进程组的每一个进程;
3.如果进程组的首进程推出,该进程组成为孤儿进程组,并且进程组中有进程处于停止状态(如发送SIGSTOP或者SIGTSTP),则先发送SIGHUP,再发送SIGCONT 通常情况下,系统对SIGHUP的默认动作是关闭进程,若想不关闭则需要对SIGHUP信号进程信号函数处理,或者视为之SIG_IGNSIGCHLD和SIGCLD: 这个信号是当子进程结束后发送给父进程的,默认动作是忽略它,此时子进程会成为僵尸进程!SIGCLD是SIGCHLD的老名字。
(区别僵尸进程和孤儿进程以及孤儿进程组:
1. 僵尸进程是子进程结束,但是父进程没有对它进行waitpid;
2. 孤儿进程是父进程结束,子进程继续执行,但是被init进程收养,则变为孤儿进程
3. 孤儿进程组是指一个进程组中的所有进程,或者父进程在本进程组中;或者父进程在所在的session之外
)
SIGCONT:
你可以发送一个SIGCONT信号给一个进程。如果这个进程之前被停止了,则进程继续;否则它什么也不做。并且呢,这个信号是不可以被sigprocmask或者pthread_sigmask进行阻塞的。
SIGSTOP和SIGTSTP:
SIGSTOP是使得某个进程停止,但是该信号不可以被处理(handled),忽略或者阻塞。如果你有这些需求,请使用SIGTSTP
SIGTTIN:
当一个进程是后台进程的时候,它是不能够从用户的控制终端进行读取的。任何试图从终端读取的后端进程都会被发送一个SIGTTIN的信号。这个信号的默认行为是停止当前进程。
SIGTTOUT:
与SIGTTIN基本相同,除了这里是输出,SIGTIIN是输入。
#include <unistd.h>
#include <signal.h>
#include <iostream>
void sighup_func(int sig_num)
{
std::cout<<"sig hup function!"<<std::endl;
}
int main(int argc,char* argv[])
{
pid_t t=fork();
if(t<0)
{
std::cout<<"error"<<std::endl;
std::cout.flush();
}
else if(t==0)
{
std::cout<<"parent process exits!"<<std::endl;
std::cout.flush();
return 0;
}
else
{
sleep(2);
signal(SIGHUP,sighup_func);
kill(0,SIGTSTP);
std::cout<<"continue!"<<std::endl;
std::cout.flush();
return 0;
}
}
refereence
http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html
http://blog.csdn.net/cugxueyu/article/details/2046565