新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 進程間通信之:信號

進程間通信之:信號

作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

本文引用地址:http://2s4d.com/article/257126.htm

8.3.2發(fā)送與捕捉

發(fā)送的函數(shù)主要有kill()、raise()、alarm()以及pause(),下面就依次對其進行介紹。

1.kill()和raise()

(1)函數(shù)說明。

kill()函數(shù)同讀者熟知的kill系統(tǒng)命令一樣,可以發(fā)送給進程或進程組(實際上,kill系統(tǒng)命令只是kill()函數(shù)的一個用戶接口)。這里需要注意的是,它不僅可以中止進程(實際上發(fā)出SIGKILL信號),也可以向進程發(fā)送其他信號。

與kill()函數(shù)所不同的是,raise()函數(shù)允許進程向自身發(fā)送信號。

(2)函數(shù)格式。

表8.7列出了kill()函數(shù)的語法要點。

表8.7 kill()函數(shù)語法要點

所需頭文件

#includesignal.h>
#includesys/types.h>

函數(shù)原型

intkill(pid_tpid,intsig)

函數(shù)傳入值

pid:

正數(shù):要發(fā)送信號的進程號

0:信號被發(fā)送到所有和當前進程在同一個進程組的進程

-1:信號發(fā)給所有的進程表中的進程(除了進程號最大的進程外)

-1:信號發(fā)送給進程組號為-pid的每一個進程

sig:信號

函數(shù)返回值

成功:0

出錯:-1

表8.8列出了raise()函數(shù)的語法要點。

表8.8 raise()函數(shù)語法要點

所需頭文件

#includesignal.h>
#includesys/types.h>

函數(shù)原型

intraise(intsig)

函數(shù)傳入值

sig:信號

函數(shù)返回值

成功:0

出錯:-1

(3)函數(shù)實例。

下面這個示例首先使用fork()創(chuàng)建了一個子進程,接著為了保證子進程不在父進程調(diào)用kill()之前退出,在子進程中使用raise()函數(shù)向自身發(fā)送SIGSTOP信號,使子進程暫停。接下來再在父進程中調(diào)用kill()向子進程發(fā)送信號,在該示例中使用的是SIGKILL,讀者可以使用其他信號進行練習。

/*kill_raise.c*/

#includestdio.h>

#includestdlib.h>

#includesignal.h>

#includesys/types.h>

#includesys/wait.h>

intmain()

{

pid_tpid;

intret;

/*創(chuàng)建一子進程*/

if((pid=fork())0)

{

printf(Forkerrorn);

exit(1);

}

if(pid==0)

{

/*在子進程中使用raise()函數(shù)發(fā)出SIGSTOP信號,使子進程暫停*/

printf(Child(pid:%d)iswaitingforanysignaln,getpid());

raise(SIGSTOP);

exit(0);

}

else

{

/*在父進程中收集子進程發(fā)出的信號,并調(diào)用kill()函數(shù)進行相應的操作*/

if((waitpid(pid,NULL,WNOHANG))==0)

{

if((ret=kill(pid,SIGKILL))==0)

{

printf(Parentkill%dn,pid);

}

}

waitpid(pid,NULL,0);

exit(0);

}

}

該程序運行結(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)文章:通信原理




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉