一、 kill函數
1.用於向任何進程組或進程發送信號
#include <signal.h>
int kill(pid_t pid, int sig);
2. 參數:
pid:可能選擇有以下四種
1. pid大於零時,pid是信號欲送往的進程的標識。
2. pid等於零時,信號將送往所有與調用kill()的那個進程屬同一個組的進程。
3. pid等於-1時,信號將送往所有調用進程有權給其發送信號的進程,除了進程1(init)。
4. pid小於-1時,信號將送往以-pid爲組標識的進程。
sig:準備發送的信號代碼,假如其值爲零則沒有任何信號送出,但是系統會執行錯誤檢查,通常會利用sig值爲零來檢驗某個進程是否仍在執行。
二、 示例說明
1. kill_process_01.c 實現等待接收信號
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
char acProcessName[32];
void sig_handler(int signo);
int main(int argc, char **argv)
{
snprintf(acProcessName, sizeof(acProcessName), "%s", argv[0]);
printf("\n [%s] main is waiting for a signal\n", acProcessName);
if(signal(SIGUSR1,sig_handler) == SIG_ERR){
perror("signal errror");
exit(EXIT_FAILURE);
}
for(; ;);//有時間讓我們發送信號
return 0;
}
void sig_handler(int signo)
{
printf("\n [%s] catch the signal SIGUSR1 %d\n", acProcessName, signo);
exit(EXIT_FAILURE);
}
2. kill_process_02.c 實現向指定進程號發送信號
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
char acProcessName[32];
int main(int argc, char **argv)
{
snprintf(acProcessName, sizeof(acProcessName), "%s", argv[0]);
int pid = 0;
if (argc != 2)
{
printf("%s [pid_number]\n", argv[0]);
return -1;
}
pid = atoi(argv[1]);
kill(pid, SIGUSR1);
printf("[%s] pid = %d\n", acProcessName, pid);
return 0;
}
3. 運行結果
1》 執行./kill_process_01 &
[./kill_process_01] main is waiting for a signal
2》 查看kill_process_01進程號爲 2853
3》 執行./kill_process_02 2853
[./kill_process_02] pid = 2853
[./kill_process_01] catch the signal SIGUSR1 10