系統編程-訊號-訊號發送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高
.