Linux 發送信號


使用kill命令
--在命令行執行kill命令。向指定進程發送信號。

 

使用kill函數
int kill(pid_t pid,int sig);
--參數pid指定一個要殺死的進程,而sig是要發送的信號。
//kill函數發送信號
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <signal.h>

int main(int arg, char *args[])
{
    if(arg<2)
    {
        printf("請輸入一個參數!\n");
        return -1;
    }
    pid_t pid=atoi(args[1]);
    int resint=0;
    resint=kill(pid,SIGKILL);
    printf("返回值是%d\n",resint);//打印0
    return 0;
}

 

使用raise函數
int raise(int signum);
kill函數將信號發送給進程,raise函數允許進程向自身發送信號
raise(signum)相當於kill(getpid(),signum);

 

alarm函數設置了一個定時器,當定時器到了給當前進程發送SIGALRM信號。
unsigned int alarm(unsigned int seconds);
seconds是計時器時間到后時鍾的秒數。
如果沒有設置其他超時,函數返回0,否則返回值為前面安排超時中保留的秒數。
一個進程只能設置一次超時
把seconds設置為0可以取消前面的超時設置。
//捕捉信號
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

void catch_signal(int sign)
{
    switch(sign)
    {
    case SIGINT:
        //SIGINT默認行為是退出進程
        printf("SIGINT signal\n");
        exit(0);
        break;
    case SIGALRM:
        //SIGALRM默認行為是退出進程
        printf("SIGALRM signal\n");
        alarm(5);
        break;
    case SIGKILL:
        printf("SIGKILL signal\n");
        break;
    }
}

int main(int arg, char *args[])
{
    signal(SIGINT,catch_signal);
    signal(SIGALRM,catch_signal);
    signal(SIGKILL,catch_signal);
    int i=0;
    //永遠循環的alarm信號
    alarm(5);
    while(1)
    {
        printf("hello god  %d\n",i++);
        sleep(1);
    }
    return 0;
}

 

abort函數
void abort(void);
該函數發送SIGABRT信號給調用進程,進程不應該忽略這個信號。
即使進程捕捉到SIGABRT這個信號,進程還是會異常退出
讓進程捕捉SIGABRT的意圖是在進程終止前由其執行所需的清理操作。

 

sleep函數
unsigned int sleep(unsigned int seconds);
參數seconds指定了睡眠時間。
超過seconds制定時間,函數返回。
嗲用進程捕捉到一個信號並從信號處理程序返回。
sleep()函數只要捕捉到一個信號就會終止sleep()函數。

 

作業控制信號
--SIGCHID     子進程已停止或終止
--SIGCONT      如果進程已經停止,使其繼續運行
--SIGSTOP      停止信號,不能被捕捉或者忽略
--SIGTIN       后台進程組成員讀控制終端
--SIGTTOU      后台進程組成員寫到控制終端
除了SIGCHLD意外,大多數程序並不處理這些信號。
shell程序一般需要處理這些信號。
信號用於大多復雜的應用程序中。
理解信號處理對於Linux變成非常重要。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM