本文關鍵字: 信號發送函數,kill(),raise()
kill()函數同讀者熟知的kill系統命令一樣,可以發送信號給進程或進程組(實際上,kill系統命令只是kill()函數的一個用戶接口)。這里需要注意的是,它不僅可以中止進程(實際上發出SIGKILL信號),也可以向進程發送其他信號。
與kill()函數不同的是,raise()函數允許進程向自身發送信號。
表1列出了kill()函數的語法要點。
表1 kill()函數語法要點
所需頭文件 |
#include <signal.h>
#include <sys/types.h>
|
函數原型 |
int kill(pid_t pid, int sig) |
函數傳入值 |
pid |
正數:要發送信號的進程號 |
0:信號被發送到所有和當前進程在同一個進程組的進程 |
1:信號發給所有的進程表中的進程(除了進程號大的進程外) |
<-1:信號發送給進程組號為-pid的每一個進程 |
sig:信號 |
函數返回值 |
成功:0 |
出錯:-1 |
表2列出了raise()函數的語法要點。
表2 raise()函數語法要點
所需頭文件 |
#include <signal.h>
#include <sys/types.h>
|
函數原型 |
int raise(int sig) |
函數傳入值 |
sig:信號 |
函數返回值 |
成功:0 |
出錯:-1 |
下面的示例首先使用fork()創建了一個子進程,接著為了保證子進程不在父進程調用kill()之前退出,在子進程中使用raise()函數向自身發送SIGSTOP信號,使子進程暫停。接下來在父進程中調用kill()向子進程發送信號,在該示例中使用的是SIGKILL,讀者可以使用其他信號進行練習。
/* kill_raise.c */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int ret;
/* 創建一個子進程 */
if ((pid = fork()) < 0)
{
printf("Fork error\n");
exit(1);
}
if (pid == 0)
{
/* 在子進程中使用raise()函數發出SIGSTOP信號,使子進程暫停 */
printf("Child(pid : %d) is waiting for any signal\n", getpid());
raise(SIGSTOP);
exit(0);
}
else
{
/* 在父進程中收集子進程發出的信號,并調用kill()函數進行相應的操作 */
if ((waitpid(pid, NULL, WNOHANG)) == 0)
{
if ((ret = kill(pid, SIGKILL)) == 0)
{
printf("Parent kill %d\n",pid);
}
}
waitpid(pid, NULL, 0);
exit(0);
}
}
該程序運行結果如下:
$ ./kill_raise
Child(pid : 4877) is waiting for any signal
Parent kill 4877
本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》
熱點鏈接:
1、Linux下的信號機制
2、有名管道(FIFO)
3、標準流管道
4、無名管道系統調用
5、Linux下進程間通信方式-管道
更多新聞>> |