77范文网 - 专业文章范例文档资料分享平台

在shell中捕捉信号的trap命令(2)

来源:网络收集 时间:2021-09-24 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

进程可以有选择的阻塞信号交付,当一个被阻塞的信号生成时,如果进程指定的动作为默认或者捕获,则此信号一直悬挂于该进程直到对此信号的阻塞放开,或者信号动作改为忽略。 系统对阻塞信号的判定是在信号交付时而非生成时,这样可以允许进程在信号被交付前改变信号动作。

每个进程有一个阻塞信号屏蔽,它定义当前被阻塞交付的那些信号。可认为它是一个位串,每位对应一个信号。如果某信号对应的位被设置,则该信号当前阻塞,进程可调用sigprocmask函数来检查或设置屏蔽。

程序错误类信号:默认动作使进程流产,产生core文件。

SIGABRT: 调用abort函数生成的信号。

SIGFPE: 浮点计算错误。

SIGILL: 非法指令错误。

SIGBUS/SIGSEGV: 硬件错误-非法地址访问。

SIGEMT: 硬件错误

SIGSYS: 非法系统调用。

SIGTRAP: 硬件错误(通常为断点指令)。

程序终止类信号:默认动作使进程终止,我们通常要处理这类信号,做一些清理工作,句柄函数应在结束时为此信号指定默认动作,然后再次生成该信号,使得程序终止。

SIGHUP:终端断开连接时,生成此信号给控制进程。

SIGINT:Ctrl-C或Delete按下时,由终端驱动生成,并发送给前台进程组中的所有进程。SIGKILL:使程序立即终止,不能被捕获或忽略,也不能被阻塞。

SIGQUIT:Ctrl-\,如SIGINT,并且产生core。

SIGTERM:该信号使程序终止,但是可以阻塞、捕获、忽略。

闹钟类信号:通知定时器到期,默认动作是终止程序,但通常会设置句柄。

SIGALRM:alarm/setitimer函数设置定时到期后,会产生此信号。

SIGPROF:

SIGVTALRM:

I/O类信号:通知进程在描述字上发生了感兴趣事件,支持信号驱动IO。

SIGIO: fd准备执行输入输出时发送此信号。

SIGPOLL:异步I/O信号。

SIGURG:网络收到带外数据时可选择生成此信号。

作业控制类信号:

SIGCHLD: 进程终止或停止时会向其父进程发送该信号,默认动作为忽略。

SIGCONT: 使停止的进程恢复运行。

SIGSTOP: 停止进程。

SIGTSTP/SIGTTIN/SIGTTOU:

操作错误类信号:默认动作终止程序。

SIGPIPE: 管道破裂。

SIGXCPU/SIGXFSZ:

signal函数:

void (* signal(int sig, void (*func)(int)))(int);

sig指明是哪一种信号。

func指明动作:SIG_DFL, SIG_IGN,或者信号句柄地址。

当信号发生时,如果func指向信号句柄,系统在将控制转往句柄前,先将该信号动作置为DFL,或者阻塞该信号直到句柄完成。

Signal函数返回值指向前一次有效动作指针:SIG_DFL,SIG_IGN,或信号地址,这提供了恢复信号动作的机制。 如果signal调用出错,返回SIG_ERR并设置errno。

进程初启时的信号动作:

fork:继承父进程的动作

exec:所有信号动作要么是忽略要么是默认。

不可靠信号:

早期版本Unix中使用signal,每当信号交付时,其动作总是由系统重置为默认动作,因此为了使信号句柄执行期间,仍能对同一信号后续做反应,需要再次调用signal。

Catch_Signal(){

// 如果第二次信号刚好在此时发生,将导致进程终止core掉。

signal(SIGQUIT,Catch_Signal);

}

Main(){

signal(SIGQUIT, Catch_Signal);

}

使用signal的另一个问题是,对于信号,进程要么忽略,要么捕获,无法在一段时间内阻塞信号(推迟信号的交付),为了克服signal兼容性问题,现代unix均实现了POSIX定义的

sigaction函数,该函数采用一个sigaction结构,除定义信号交付时要采取的动作外,还包含其他一些动作控制信息。

sigaction还允许调用进程检测或指定与特定信号相关的动作。

int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);sig指定信号-除SIGKILL和SIGSTOP。

如果act为NULL,则不改变信号动作,只查询当前动作。

成功返回0,失败则不安装新信号动作,返回-1,设置errno。

struct sigaction{

void (*sa_handler)(int); // 同signal的第二参数func。

void (*sa_sigaction)(int, siginfo_t*, void*); // 仅当flags设置SA_SIGINFO起作用。

sigset_t sa_mask; // 指明信号执行期间要阻塞的一组信号,除此之外导致信号句柄执

行的信号也自动阻塞,除非指定了SA_NODEFER。信号句柄正常返回时,屏蔽恢复到原先状态。

int sa_flags; //

};

sa_flags是一个位串,可以通过或运算生成。可设置下列标志:

SA_NOCLDSTOP: 只对CHLD信号起作用,子进程暂停时不发信号给父进程。

SA_RESTART: 信号句柄返回时,自动恢复被该信号中断的系统调用。否则该系统调用将中断返回-1,并设置errno为EINTR。

SA_ONSTACK:

SA_RESETHAND:信号句柄入口,系统将重置信号动作为SIG_DFL.

SA_NODEFER:句柄执行期间,不自动阻塞该信号。

SA_NOCLDWAIT:只对CHLD起作用,调用进程的所有子进程在终止时不会成为Zombe。这种情况下,父进程无需要wait子进程,并且子进程终止也不向父进程发SIGCHLD信号。

如果父进程调用wait,将阻塞到所有子进程终止,并返回-1,errno设为ECHILD.

SA_SIGINFO:如果未设置此标志,则信号句柄原型为:

void func(int signo);

如果设置此标志,则句柄原型为:

void func(int signo, singinfo_t* info, void* context);

Info- 解释信号生成的原因。

Context-信号被交付时所中断进程的上下文。

一旦用sigaction为特定信号建立了动作,该动作就一直保持,直到另一次调用sigaction,或者调用exec,或者因设置了SA_RESETHAND导致系统自动改变动作为默认为止。

除了外部中断产生信号外,程序可以显式的调用raise函数给他自己发送信号,或调用kill向自己或其他进程发送信号。

阻塞信号意味着保持该信号并推迟它的交付,可以防止程序中的关键代码被信号中断。信号集操作:

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说英语学习在shell中捕捉信号的trap命令(2)在线全文阅读。

在shell中捕捉信号的trap命令(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/yingyu/1246168.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: