去年做專案的時候,我遇到了乙個問題。當時我想通過前台傳過來乙個套接字,對我後面的程式產生影響(這兩個屬於不同的執行緒)。當時我想的是建立乙個txt檔案,乙個執行緒往裡寫,另乙個往回讀。但是發現乙個問題(等我寫完這個部落格我會畫個圖的,見諒),那就是讀的程序對檔案的讀操作執行非常快。理論上等於ip資料報的速度。後來寫了一下,果然是沒有效果。
前幾天看了《unix系統程式設計》,原來這就是管道的思想。演算法與資料結構誠然是電腦科學的靈魂,但是第一我學的也不好, 第二像作業系統這種東西還是要好好看看的,當成黑盒或者僅僅從本科作業系統課層面來理解都不對。
管道就是借助vfs(虛擬檔案系統層)來做的。那什麼是vfs呢
inode,dentry,超級塊元用來讓系統感知和處理檔案系統比如說,超級塊用來處理各個檔案系統的資訊。(這個檔案系統我會專門寫部落格討論)。
但是管道與檔案系統的不同在於管道僅僅利用vfs而不和具體的檔案系統相關(不與磁碟有關)。這樣速度可以得到保證(並且你程序間通訊也沒必要同步磁碟)
(ps:等我找幾個圖補到這裡。。)
code例子(**unix網路程式設計卷2):
(父程序從標準輸入讀取檔案路徑,子程序收到後把內容解析出來返回父程序,這兩個操作都是通過單向管道實現的)
#include
"unpipc.h"
/* 通常第乙個 字母為大寫的函式 是 寫的殼函式
方便測試與 移植。
* */
void
client
(int
,int);
void
server
(int
,int);
intmain()
close
(pipe1[0]
);close
(pipe2[1]
);client
(pipe2[0]
,pipe1[1]
);waitpid
(childpid,
null,0
);exit(0
);return0;
}void
client
(int readfd,
int writefd)
}void
server
(int readfd,
int writefd)
else
}
這個**的環境是需要搭建的。為了保持**對於所有unix系統(畢竟不只是linux,還有bsd那種呢)的實用性(他們有的並不使用posix標準呀)。作者寫了乙個個大大的標頭檔案和相關函式來處理系統呼叫的不同和相關引數的衝突。搭建過程見部落格
編譯指令 gcc -o xx ***.c -lunpipc -lpthread -lrt
未完待續。。
《unix系統程式設計》
《unix網路程式設計2:程序通訊》
php程序間通訊 yoc PHP程序間通訊
php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...
程序間通訊
最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...