linux中唯一非同步通訊方式,訊號的介紹和使用

2021-12-29 19:52:39 字數 1441 閱讀 9863

1.linux訊號是一種古老的程序間通訊的方式,唯一一種非同步通訊的方式,訊號的預設處理方式一般是結束當前程序如sigint,sigquit等,應用程序可以自己控制程序處理的方式和流程.

2.訊號的註冊 使用signal函式或者sigaction函式註冊,

3.訊號是不可靠的程序間通訊方式,在訊號的執行例程中不能被同一種訊號打斷,但是會被程序接收到的其他訊號所打斷,

#include

#include

#include

#include

void interrupt(int sig)

void quit(int sig)

int main()

``interrupt set for sigint

^cintertupt start

^cinterrupt end

intertupt start

interrupt end

program normal end

interrupt set for sigint

^cintertupt start

^\quit start

^\^\quit end

quit start

quit end

interrupt end

program normal end

第一種執行方式,在處理sigint訊號時,傳送乙個sigint訊號,程序需要等待到第乙個訊號的執行結束後,再繼續執行第二個訊號執行過程,

第二種執行方式,在處理sigint訊號時,傳送sigquit訊號給程序,程序需要轉到sigquit訊號處理程式執行再返回,相當於巢狀的中斷.

說明三,我們同時傳送了兩個sigquit訊號,但是卻只執行了一次,說明訊號是不可靠的通訊方式,同一時間接收到的相同訊號不會被儲存下來,存在丟失的可能性.

3訊號與系統呼叫

在執行系統呼叫的時候,程序接收到的訊號一般不能打斷系統呼叫的執行過程,而需要等待系統呼叫執行完畢才能執行對應的處理函式,. 但是當系統呼叫是慢速系統的時候就會被打斷,如sleep,pause以及read write等系統呼叫.

4 kill 系統呼叫用於向指定的程序傳送指定的訊號,

int kill(int pid,int sig);

5 alarm 系統呼叫通知核心在執行 若干秒後傳送sigarlm訊號該程序.fork()後在子程序中失效,在exec後有效,

訊號處理方式在fork後有效,但是在exec後無效, 因為子程序的位址空間已經被覆蓋,訊號處理函式變得不可見.

6 setjump 和longjmp

當處理訊號時有時候希望回到程式中以前的位置執行,這時候需要使用setjmp

儲存跳回位置的上下文環境,然後再使用longjmp 執行跳回的動作.

int setjmp(jmp_buf env);

void longjmp(jmp_buf env,intval);

linux程序中的通訊方式

1.管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2.有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。3.訊號量 semophore 訊號量是乙個計數器,可以用來控...

Linux系統中的程序間通訊方式

unix程序間通訊方式 包括管道 pipe 有名管道 fifo 和訊號 signal 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係 父子程序 的程序間使用。另外管道傳送的是無格式的位元組流,並且管道緩衝區的大小是有限的 管道緩衝區存在於記憶體中,在管道建立時,...

linux下8中程序間通訊方式

1,無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係 2,高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式 3,有名管道 named ...