一般的檔案訪問函式(close,read,write)等可用於fifo.當開啟fifo時,非阻塞標誌(o_nonblock),,沒有使用o_nonblock訪問要求無法滿足時程序將阻塞
如果試圖讀取空的fifo,將導致程序阻塞。
使用o_nonblock,訪問要求無法滿足時不阻塞,立刻出錯返回,errno是enxio
二、訊號通訊
sighup:從終端上發出的結束訊號
sigint:來自鍵盤的中斷訊號(ctrl-c)
sigkill:該訊號結束接收訊號的程序
sigterm:kill命令發出的訊號
sigchld:標識子程序停止或結束的訊號
sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號,
訊號處理:
1、忽略此訊號----大多數的訊號都按這種方式進行處理,但sigkill和sigstop不能被忽略
因為他們向超級使用者提供了一種終止或停止程序的方法
2、執行使用者希望的動作,
3、執行系統預設動作,----大多數的訊號的系統預設動作是終止該程序
傳送訊號的主要函式有kill和raise kill既可以向自身傳送訊號,也可以向其它程序傳送
而raise函式是向程序自身傳送訊號 kill -s 訊號型別, 程序號。
#include
#include
int kill(pid_t pid,int signo)
int raise(int signo)
使用alarm函式可以設定乙個時間值(鬧鐘時間),當所設定的時間到了時,產生sigalrm訊號
如果不捕此訊號,則預設動作是終止該程序
#include
unsigned int alarm(unsigned int seconds)
經過指定的seconds秒之後會產生訊號sigalrm
pause 函式使呼叫程序掛起直到捕捉到乙個訊號
#include
int pause(void) 只有執行了乙個訊號處理函式後,掛起才結束
訊號處理的主要方法有:一是用簡單的signal函式,另一種是使用訊號集函式組
#include
void(*signal(int signo,void (*func)(int)))(int)
typedef void(*sighandler_t)(int)
sighandler_t signal(int signum,sighandler_t handler)
func可能是:1、sig_ign:忽略此訊號,2、sig_dfl:按系統預設方式處理 3、訊號處理函式名
三、記憶體共享
步驟:1、建立共享記憶體,使用shmget函式 2、對映共享記憶體,將這段建立的共享記憶體對映到具體的程序
空間去,使用shmat函式。
int shmget (key_t key,int size ,int shm***)
key標識共享記憶體的鍵值:0/ipc_private,當key的取值為ipc_private,則函式shmget()
將建立一塊新的共享記憶體;如果key的取值為0,而引數shm***中又設定ipc_private這個
標誌,則同樣會建立一塊新的共享記憶體
如果成功,返回共享記憶體識別符號;如果失敗返回-1;
對映:int shmat(int shmid,char *shmaddr,int flag)
shmid:shmget函式返回的共享儲存識別符號,而第二個是引數是對映的位址,如果是0,則表示系統自動幫你
找乙個位址
flag:決定以什麼方式來確定對映的位址(通常為0)
返回成功,則返回共享記憶體對映到程序中的位址,如果失敗返回-1
共享記憶體,當乙個程序不再需要共享記憶體時,需要把它從程序位址空間中脫離
int shmdt(char *shmaddr)
程序間通訊方法比較
win32應用程式中程序間通訊方法分析與比較 1 程序與程序通訊 程序是裝入記憶體並準備執行的程式,每個程序都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案 管道等 組成。多程序 多執行緒是windows作業系統的乙個基本特徵。microsoft win32應用程式設計介面 appli...
序列通訊程序
1 從鍵盤上讀入一串字元並在本機上顯示 data segment msg1 db 13,10,please input a char 13,10,13,10,ddd1 db 13,10,13,10 ddd2 db 81 dup data ends code segment assume cs cod...
程序間通訊 linux
程序間通訊 1,使用共享記憶體 共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。通過mmap 可以將檔案對映到不同的程序空間中,將他們作為多個程序共享的記憶體實現程序間通訊。利用mmap 進行程序間的資訊互動是無格式的,可以自己定義...