目录
一、相关函数分析
signal函数
kill函数
raise函数
pause函数
二、实例展示
实例1,signal&alarm&pause
实例2,signal&kill&raise
首先认识几个相关的信号函数,signal、kill、raise、pause。
一、相关函数分析 signal函数void (*signal(int signum,void(* handler)(int)))(int);
说明:当前进程收到signum对应的信号之后,会执行handler指向的函数。
其中signum有
#define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGIOT 6 #define SIGABRT SIGIOT #define SIGEMT 7 #define SIGFPE 8 #define SIGKILL 9 #define SIGBUS 10 #define SIGSEGV 11 #define SIGSYS 12 #define SIGPIPE 13 #define SIGALRM 14 #define SIGTERM 15 #define SIGUSR1 16 #define SIGUSR2 17 #define SIGCHLD 18 #define SIGCLD SIGCHLD #define SIGPWR 19 #define SIGWINCH 20 #define SIGURG 21 #define SIGIO 22 #define SIGPOLL SIGIO #define SIGSTOP 23 #define SIGTSTP 24 #define SIGCONT 25 #define SIGTTIN 26 #define SIGTTOU 27 #define SIGVTALRM 28 #define SIGPROF 29 #define SIGXCPU 30 #define SIGXFSZ 31
如果handler不是函数指针,则必须是SIG_IGN(忽略当前的信号)、SIG_DFL(将参数指定的信号重新设为系统预设的信号处理方式)。
信号发生之后会跳到指定的handler处理函数,系统这时候相当于把signum对应的默认处理方式替换为用户指定的处理方式,等执行完用户自定的处理方式之后,系统会把它替换回来。如果想替换系统原来的默认处理方式可以参考函数sigaction。
int kill(pid_t pid,int sig);
说明:该函数用于向指定的进程pid,发送sig信号编号。
其中参数pid有以下情景:
sig参考上面的signal对应的signum。
raise函数int raise (int sig);
说明:向同一进程发送sig编号的信号。它与kill的区别是,raise不可以指定pid,只能指向当前的进程。
pause函数int pause(void);
说明:让当前进程暂停(进入睡眠模式)直到被信号中断。
二、实例展示 实例1,signal&alarm&pausesignal注册一个SIG_ALARM处理函数,pause暂停程序返回,等signal处理完后,继续执行
#include#include #include #include void alarmHandler(){ printf("alarmHandler func.n"); } int main(){ int ret; printf("listen signal...n"); signal(SIGALRM, &alarmHandler); ret = alarm(5); pause();// wait until signal arrived printf("ok ret is %dn", ret); return 0; }
运行结果:
实例2,signal&kill&raiselisten signal...
alarmHandler func.
ok ret is 0
实例展示kill和raise的使用,通过fork创建一个子进程,父进程用raise发送信号给自己,子进程用kill发送给自己或同组的其它进程,同事我们可以看到子进程继承了父进程的signal函数。
#include#include #include #include #include void my_func(int sig_no){ if(sig_no == SIGINT){ printf("I have get SIGINT pid=%dn", getpid()); }else if(sig_no == SIGQUIT){ printf("I have get SIGQUIT pid=%dn", getpid()); } } int main(){ pid_t pid, ppid, cpid; printf("Waitting for SIGINT or SIGQUITn"); signal(SIGINT, my_func); signal(SIGQUIT, my_func); pid = fork(); if (pid > 0) { ppid = getpid(); printf("parent process pid=%dn", ppid); raise(SIGQUIT); }else if (pid == 0) { cpid = getpid(); printf("chlid process pid=%dn", cpid); sleep(1); kill(0, SIGINT); //kill(ppid, SIGINT); //kill(cpid, SIGINT); //raise(SIGQUIT); } pause(); exit(0); }
运行结果
Waitting for SIGINT or SIGQUIT
parent process pid=111605
I have get SIGQUIT pid=111605
chlid process pid=111606
I have get SIGINT pid=111606
I have get SIGINT pid=111605
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)