①進程A/內核選擇信號
②發送信號
③進程B接收信號並處理
Linux系統支持的所有信號均定義在/usr/include/asm/signal.h,其中常見的信號有:
①SIGKILL:殺死進程
②SIGSTOP:暫停進程
③SIGCHLD:子進程停止或結束時用來通知父進程
常用到的函數有:
kill函數
<pre name="code" class="objc">原型:int kill(pid_t,int sig)
頭文件:<sys/types.h><signal.h>
功能:<span style="color:#ff0000;">傳送信號給特定的進程,成功返回0,失敗返回-1</span>
參數:
pid爲接受信號的進程號:
1. pid大於零時,pid是信號欲送往的進程的ID。
2. pid等於零時,信號將送往所有與調用kill()的那個進程屬同一個使用組的進程。
3. pid等於-1時,信號將送往所有調用進程有權給其發送信號的進程,除了進程1(init)。
4. pid小於-1時,信號將送往以-pid爲組標識的進程。
sig:發送的信號
signal函數
<pre name="code" class="objc">原型:typedef void (*sighandler_t)(int);/*函數指針*/
sighandler_t signal(int signum,sighandler_t handler)
頭文件:<signal.h>
功能:<span style="color:#ff0000;">設置信號處理方式,成功則返回處理函數的函數指針,失敗返回SIG_ERR</span>
參數:signum:設置信號處理函數所依賴的信號編號
handler:信號處理函數。如果參數handler不是函數指針,則必須是下列兩個常數之一:
SIG_IGN:忽略參數signum指定的信號
SIG_DEL:將參數signum指定的信號重設爲預設的信號處理方式
pause函數
<pre name="code" class="objc">原型:int pause(void)
頭文件:<unistd.h>
功能:<span style="color:#ff0000;">等待信號</span>
實例
send_signal.c (發送代碼):
<pre name="code" class="objc">#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = atoi(argv[1]); //字符到數字的轉換,信號實質爲數字
kill(pid, SIGINT); //傳送信號到特定進程pid
return 0;
}
receive_signal.c(接收代碼):
<pre name="code" class="objc">#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void myfunction(int signal_sum)//自定義信號處理函數
{
if( signal_sum == SIGINT )
{
printf("capture signal is : SIGINT\n");
}
}
void main()
{ /*設置處理方式*/
signal(SIGINT, myfunction);
printf("wait ......\n");
/*等待一個信號產生後才停止等待*/
pause();
exit(0);
}