网站宽度设计,移动wifi多少钱一个月,哪些平台可以发广告,免费分销方案如何打造更强的分销团队目录
信号递达期间#xff0c;该信号会被屏蔽直到递达完成。
sigaction实现信号的捕捉#xff1a;
案例#xff1a;在处理2号信号时屏蔽3号信号。
子进程退出向父进程发送SIGCHLD信号#xff1a; 信号递达期间#xff0c;该信号会被屏蔽直到递达完成。 当某个信号的处…目录
信号递达期间该信号会被屏蔽直到递达完成。
sigaction实现信号的捕捉
案例在处理2号信号时屏蔽3号信号。
子进程退出向父进程发送SIGCHLD信号 信号递达期间该信号会被屏蔽直到递达完成。 当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字block中,当信号处理函数返回时自动恢复原来的信号屏蔽字。 这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。
sigaction实现信号的捕捉 sigaction接口的功能类似于signal接口但是在捕捉信号后信号自定义函数的执行过程中可以设置sa_mask字段来屏蔽一些其他的信号。防止同时处理这些信号
#include signal.h
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
//act表示自定义处理函数
//oldact返回型参数记录修改前的处理函数的地址
案例在处理2号信号时屏蔽3号信号。 通过设置struct sigaction 的 sigset_t sa_mask;成员来达到上述目的。 下面代码可以实现在处理2号信号期间阻塞3号信号。
#includeiostream
#includeunistd.h
#includesignal.h
using namespace std;
void handle(int sig)
{couti am signal:sigendl;
}
int main()
{coutpid : getpid()endl;struct sigaction act,oldact; //创建两个struct sigaction结构体act.sa_handlerhandle; //设置自定义信号处理函数sigemptyset(act.sa_mask); //清空sa_masksigaddset(act.sa_mask,3); //向sa_mask添加要屏蔽的信号sigaction(2,act,oldact); //捕捉信号while(true){sleep(1);}return 0;
}
子进程退出向父进程发送SIGCHLD信号 子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略。 父进程可以自定义SIGCHLD信号的处理函数在信号处理函数中调用wait清理子进程即可。这样父进程只需专心处理自己的工作,不必关心子进程了。 如果需要获取子进程的退出信息就需要wait等待子进程。但是如果不需要获取子进程的退出信息。可以使用以下代码通过信号的方式回收子进程使得父进程不用等待子进程。
signal(SIGCHLD,SIG_IGN); //这种方式只对Linux操作系统有效