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 ...