信号发送
kill 和 raise函数
kill函数参数详解:
实验1 raise和kill 的使用
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> //定义信号处理函数 //signo: 进程捕获到的信号 void sig_handler(int signo){ printf("%d, %d occured \n", getpid(), signo); wait(NULL); } int main(void) { pid_t pid; if(signal(SIGUSR1, sig_handler) == SIG_ERR){ perror("signal error"); } if(signal(SIGUSR2, sig_handler) == SIG_ERR){ perror("signal error"); } sleep(1); printf("向进程自己发送SIGUSR1 和 SIGUSR2 .\n"); raise(SIGUSR1); kill(getpid(), SIGUSR2); while(1){ sleep(1); } }
编译运行:
结论1.1:raise(SIGUSR1) 等价于 kill(getpid(), SIGUSR2)
结论1.2: 进程可以向自己发送信号
实验2 进程能够自杀吗?
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> //定义信号处理函数 //signo: 进程捕获到的信号 void sig_handler(int signo){ printf("%d, %d occured \n", getpid(), signo); wait(NULL); } int main(void) { pid_t pid; if(signal(SIGUSR1, sig_handler) == SIG_ERR){ perror("signal error"); } if(signal(SIGUSR2, sig_handler) == SIG_ERR){ perror("signal error"); } sleep(1); printf("进程能够自杀吗?\n"); raise(SIGKILL); while(1){ sleep(1); } }
编译运行:
结论: 进程可以通过发送9号信号杀死自己
定时器 alarm 和 ualarm
实验3 alarm使用
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> //定义信号处理函数 //signo: 进程捕获到的信号 void sig_handler(int signo){ if(signo == SIGALRM){ printf("clock time out \n"); //需要重新设置定时器,使之成为一个周期性触发的定时器 if(0 != alarm(5)){ perror("alarm:5 error"); } } } int main(void) { pid_t pid; int cnt=0; if(signal(SIGALRM, sig_handler) == SIG_ERR){ perror("signal error"); } if(0 != alarm(5)){ perror("alarm:5 error"); } while(1){ printf("main -- 1s -- \n"); sleep(1); if((cnt++) == 13) alarm(0); } return 0; }
编译运行:
ualarm:微妙级别的定时器,精读比alarm高
.