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