Linux信號通訊編程(國嵌總結)

信號通訊流程爲: 
①進程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);
}













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章