linux 信号与处理 (2)

signal()
"signal.h"信号处理库提供了signal函数,用来捕获突发事件。以下是 signal() 函数的语法ads。

typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);

signum:可使用信号名(宏)或信号的数字编号,建议使用信号名。

handler:参数 handler 既可以设置为用户自定义的函数,也可以设置为 SIG_IGN 或 SIG_DFL,SIG_IGN 表示此进程需要忽略该信号,SIG_DFL 则表示设置为系统默认操作。

raise()
有时进程需要向自身发送信号,raise()函数可用于实现这一要求.

int raise(int sig);

sig:需要发送的信号。

sigaction()
除了signal()之外,sigaction()系统调用是设置信号处理方式的另一选择,虽然 signal()函数简单好用,而 sigaction()更为复杂,但作为回报,sigaction()也更具灵活性以及移植性。

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

signum:需要设置的信号,除了 SIGKILL 信号和 SIGSTOP 信号之外的任何信号。

act:参数 act 不为 NULL,则表示需要为信号设置新的处理方式;如果参数 act 为 NULL,则表示无需改变信号当前的处理方式

oldact:参数oldact 不为 NULL,则会将信号之前的处理方式等信息通过参数 oldact 返回出来;如果无意获取此类信息,那么可将该参数设置为 NULL。

返回值:成功返回 0;失败将返回-1,并设置 errno。
struct sigaction 结构体

struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };

sa_handler:指定信号处理函数,与 signal()函数的 handler 参数相同。

sa_sigaction:也用于指定信号处理函数,这是一个替代的信号处理函数。

sa_mask:参数 sa_mask 定义了一组信号。

sa_restorer:该成员已过时,不要再使用了。

sa_flags:参数 sa_flags 指定了一组标志,这些标志用于控制信号的处理过程。

kill()
kill()系统调用可将信号发送给指定的进程或进程组中的每一个进程。

int kill(pid_t pid, int sig);

pid:参数 pid 为正数的情况下,用于指定接收此信号的进程 pid。

sig:参数 sig 指定需要发送的信号,也可设置为 0,如果参数 sig 设置为 0 则表示不发送信号,但任执行错误检查,这通常可用于检查参数 pid 指定的进程是否存在。

返回值:成功返回 0;失败将返回-1,并设置 errno。

alarm()
使用 alarm()函数可以设置一个定时器(闹钟),当定时器定时时间到时,内核会向进程发送 SIGALRM信号。

unsigned int alarm(unsigned int seconds);

seconds:设置定时时间,以秒为单位;如果参数 seconds 等于 0,则表示取消之前设置的 alarm 闹钟。

返回值:如果在调用 alarm()时,之前已经为该进程设置了 alarm 闹钟还没有超时,则该闹钟的剩余值作为本次 alarm()函数调用的返回值,之前设置的闹钟则被新的替代;否则返回 0。

pause()
pause()系统调用可以使得进程暂停运行、进入休眠状态,直到进程捕获到一个信号为止,只有执行了信号处理函数并从其返回时,pause()才返回,在这种情况下,pause()返回-1,并且将 errno 设置为EINTR。

int pause(void);

使用案例
demo1

#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> void signal_handler(int signum) { printf("Interrupt signal (%d) received. \n", signum); switch(signum){ case SIGINT: printf("ctrl + c \n"); exit(signum); break; case SIGQUIT: printf("ctrl + \\ \n"); exit(signum); } } int main(int argc, char *argv[]) { int i = 0; //注册信号与信号处理程序 signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); while(1) { printf("Going to sleep....\n"); if (i > 5){ raise( SIGINT); } sleep(1); i++; } return 0; } 参考文献

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfsfp.html