使用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變成非常重要。