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