進(jìn)程間通信之:信號
8.3.2信號發(fā)送與捕捉
發(fā)送信號的函數(shù)主要有kill()、raise()、alarm()以及pause(),下面就依次對其進(jìn)行介紹。
1.kill()和raise()
(1)函數(shù)說明。
kill()函數(shù)同讀者熟知的kill系統(tǒng)命令一樣,可以發(fā)送信號給進(jìn)程或進(jìn)程組(實(shí)際上,kill系統(tǒng)命令只是kill()函數(shù)的一個(gè)用戶接口)。這里需要注意的是,它不僅可以中止進(jìn)程(實(shí)際上發(fā)出SIGKILL信號),也可以向進(jìn)程發(fā)送其他信號。
與kill()函數(shù)所不同的是,raise()函數(shù)允許進(jìn)程向自身發(fā)送信號。
(2)函數(shù)格式。
表8.7列出了kill()函數(shù)的語法要點(diǎn)。
表8.7 kill()函數(shù)語法要點(diǎn)
所需頭文件 | #includesignal.h> | |
函數(shù)原型 | intkill(pid_tpid,intsig) | |
函數(shù)傳入值 | pid: | 正數(shù):要發(fā)送信號的進(jìn)程號 |
0:信號被發(fā)送到所有和當(dāng)前進(jìn)程在同一個(gè)進(jìn)程組的進(jìn)程 | ||
-1:信號發(fā)給所有的進(jìn)程表中的進(jìn)程(除了進(jìn)程號最大的進(jìn)程外) | ||
-1:信號發(fā)送給進(jìn)程組號為-pid的每一個(gè)進(jìn)程 | ||
sig:信號 | ||
函數(shù)返回值 | 成功:0 | |
出錯(cuò):-1 |
表8.8列出了raise()函數(shù)的語法要點(diǎn)。
表8.8 raise()函數(shù)語法要點(diǎn)
所需頭文件 | #includesignal.h> |
函數(shù)原型 | intraise(intsig) |
函數(shù)傳入值 | sig:信號 |
函數(shù)返回值 | 成功:0 |
出錯(cuò):-1 |
(3)函數(shù)實(shí)例。
下面這個(gè)示例首先使用fork()創(chuàng)建了一個(gè)子進(jìn)程,接著為了保證子進(jìn)程不在父進(jìn)程調(diào)用kill()之前退出,在子進(jìn)程中使用raise()函數(shù)向自身發(fā)送SIGSTOP信號,使子進(jìn)程暫停。接下來再在父進(jìn)程中調(diào)用kill()向子進(jìn)程發(fā)送信號,在該示例中使用的是SIGKILL,讀者可以使用其他信號進(jìn)行練習(xí)。
/*kill_raise.c*/
#includestdio.h>
#includestdlib.h>
#includesignal.h>
#includesys/types.h>
#includesys/wait.h>
intmain()
{
pid_tpid;
intret;
/*創(chuàng)建一子進(jìn)程*/
if((pid=fork())0)
{
printf(Forkerrorn);
exit(1);
}
if(pid==0)
{
/*在子進(jìn)程中使用raise()函數(shù)發(fā)出SIGSTOP信號,使子進(jìn)程暫停*/
printf(Child(pid:%d)iswaitingforanysignaln,getpid());
raise(SIGSTOP);
exit(0);
}
else
{
/*在父進(jìn)程中收集子進(jìn)程發(fā)出的信號,并調(diào)用kill()函數(shù)進(jìn)行相應(yīng)的操作*/
if((waitpid(pid,NULL,WNOHANG))==0)
{
if((ret=kill(pid,SIGKILL))==0)
{
printf(Parentkill%dn,pid);
}
}
waitpid(pid,NULL,0);
exit(0);
}
}
該程序運(yùn)行結(jié)果如下所示:
$./kill_raise
Child(pid:4877)iswaitingforanysignal
Parentkill4877
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)模擬信號相關(guān)文章:什么是模擬信號
linux相關(guān)文章:linux教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論