程序間通訊的幾種方法
1 檔案(效率低,基本不使用)
2 管道 (在檔案的基礎上改進的方式)
3 訊號 (效率較高,但是傳輸資料不方便,只能傳輸整形數,有點像中斷)
4 ipc通訊(訊息佇列和共享記憶體)
訊號量(不負責通訊,只負責保護通訊時的安全,也是ipc)
管道通訊
無名管道:只用於父子程序之間的通訊。
有名管道:可用於不同程序之間的通訊。(也可以用於父子之間)
管道檔案不是可以無窮寫入的,當管道寫滿後,寫函式會阻塞(等待讀取)
無名管道的建立
int pipe(int pipefd)
arg1 無名管道的兩個埠(讀和寫)
即1為寫端,0為讀端。需要程序間配合使用。
int main()
; int fd=pipe(pipefd);
if(fd != 0)
else
int len=0;
char buf[10]=;
while(1)
*///自己讀走
read(pipefd[0],buf,10);
printf("get:%s\n",buf);
}}
有名管道的建立
1 使用命令的方式建立
mkfifo 檔名
(共享目錄不支援管道檔案)
2 函式建立
int mkfifo(const char *pathname,mod_t mode);
arg1 需要建立的管道路徑
arg2 許可權
int fd=mkfifo("/home/gec/pipe",0777);
if(fd != 0)
有名管道的操作
1 open 開啟管道檔案
2 write/read 讀寫管道
3 close 關閉管道
注意事項:1 管道檔案的資料時先進先出的
2 管道檔案的讀寫都會阻塞
3 管道檔案不可以用lseek偏移游標
int fd = open("/home/gec/pipenode",o_rdwr);
if(fd < 0)
//不斷往管道中寫入資料
int len=0;
while(1)
訊號
訊號的命令
man 7 signal檢視
抓捕linux系統中的訊號
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
引數一:需要捕抓訊號值
引數二:對應的處理函式
sig_ign ->忽略該訊號
sig_dfl ->執行預設動作
使用者自定義動作void (*sighandler_t)(int) -> 函式指標,指向返回型別為 void 引數為int的函式 (處理函式)
訊號傳送
void func(int arg)
int main()
sleep(1);
} return 0;
}
給自己傳送訊號
int raise(int sig); 等價於kill(getpid(), sig);
傳送鬧鈴訊號
//訊號處理函式
void func(int arg)
int main()
return 0;
}
關於程序間通訊
程序間通訊 ipc 的方式很多。下面進行歸類總結。在傳統的程序間通訊中有 無名管道,有名管道,訊號通訊。後來system v 退出了自己的ipc 方式 訊息佇列,共享記憶體和訊號燈集合但是system v的通訊方式也存在自己的缺點。posix 在此基礎上退出了自己的posix的訊息佇列,共享記憶體和...
程序間通訊和執行緒間通訊總結
死鎖的四個必要條件 資源有限 持有等待 不能搶占 迴圈等待條件 死鎖的應對方式 消除獨佔條件 即將資源無限增加或者變為共享 消除保持和請求條件 即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。消除非搶占條件 即允許對資源進行搶占 消除迴圈等待條件 即產生迴圈等待...
程序間通訊方法總結
程序間通訊方法總結 程序通常被定義為乙個正在執行的程式的例項,它由兩個部分組成 乙個是作業系統用來管理程序的核心物件。核心物件也是系統用來存放關於程序的統計資訊的地方 另乙個是位址空間,它包含所有的可執行模組或dll模組的 和資料。它還包含動態分配的空間。如執行緒堆疊和堆分配空間。每個程序被賦予它自...