程序間通訊IPC 訊號

2021-07-27 21:13:46 字數 1603 閱讀 2365

//**********==訊號

**********==

訊號是程序間唯一的非同步通訊

1:由硬體檢測產生(

sigsegv

:段錯誤)

2:由終端按鍵產生(

sigint

:ctrl+c)

3:由軟體本身產生(

sigpipe

:管道)

4:由核心傳送(

sigio

、sigurg)

5:由其他程序傳送(

kill)

收到乙個訊號該怎麼處理:

1:忽略該訊號

2:按照預設方式處理

3:由使用者自定義處理(

signal)(

捕捉)常用的訊號

#define sighup 1    //父程序給子程序發的

#define  sigchld  17 //子程序給父程序傳送的

sigint  //ctrl + c

sigquit  //ctrl + \

sigabrt  //當呼叫

abort()

函式的時候,讓程序非正常結束;

sigfpe   //當發生算數異常的時候給當前程序傳送該訊號

sigkill  //可以直接殺死某個程序(系統程序)

sigsegv  //發生段錯誤時會向當前程序傳送該訊號

sigpipe  //在管道中,當管道的讀端關閉,寫端寫入資料則會收到

sigpipe訊號

sigalrm  //當鬧鐘定時結束,程序收到該訊號

sigstop  //傳送該訊號,程序暫停,

gdb除錯中的打斷點

sigcont   //gdb除錯中跳過斷點

sigio     //由核心傳送給應用程序

sigurg    //在網路程式設計中,當網絡卡收到緊急資料

(帶外資料

)時,會收到該訊號

//這兩個沒有特殊的意義,具體該做什麼由程式設計師來決定

sigusr1

sigusr2

void (*signal(int signum, void (*handler)(int)))(int);

void func(int arg)

void (*p)(int);

p = signal(sigusr1, func); //這個函式執行時,只是告訴核心,以後

//如果收到

sigusr1

訊號,則去執行

func函式

//p表示上一次

sigusr1

的訊號處理函式

sigkill和

sigstop

不能使用

signal

進行註冊

pause: 可以阻塞當前程序,直到受到任意乙個訊號為止,可以用來實現多個程序之間的同步

,注意使用訊號實現程序間的同步有一定

的缺陷,因為pause在收到任何訊號,都會繼續,有時候會接受意外的訊號,達不到預期的要求。

sleep:可以讓程序睡眠,在睡眠過程中,只要收到訊號就會醒來。

子程序會繼承父程序對訊號的處理方式。

當使用終端按鍵給程式發訊號時,產生的訊號會發給程式中所有的程序.

程序間通訊(IPC) 訊號

關於訊號的常用命令 kill l 檢視系統中所有的訊號 需要的標頭檔案 include include 引數原型 int kill pid t pid,int sig pid 要傳送訊息的程序號 sig 訊號 例如 kill pid,signum 返回值 成功返回0 失敗返回 1 需要的標頭檔案 i...

程序間通訊IPC 訊號量

訊號量 訊號量 主要來實現程序間或執行緒間的同步 也可以實現互斥 訊號量的值 表示資源的可用量。訊號量操作流程 1 建立乙個訊號量集合 param 2 訊號量集合中訊號量的個數 int semid int semget key t key,int nsems,int sem semid semget...

IPC程序間通訊(訊號量)

訊號量是乙個計數器,用於為多個程序提供對共享資料物件的訪問。訊號量和p v原語操作是由dijkstra 迪傑斯特拉 所提出的。執行p操作時,將該程序狀態設定為等待狀態,並把 該程序的pcb插入相應的等待佇列s.queue末尾 執行v操作時,喚醒相應等待佇列s.queue中等待的乙個程序 改變其狀態為...