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

 

 

 

 

.