系统编程-信号-信号发送kill、raise、alarm
信号发送
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高
.
/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/