當前位置:首頁 » 編程軟體 » 進程間通信編程

進程間通信編程

發布時間: 2022-08-16 11:44:24

Ⅰ 進程間通信的方法有哪些那一種方法效率最高進程間同步機制有哪些

進程間通信機制

1 文件映射
文件映射(Memory-Mapped Files)能使進程把文件內容當作進程地址區間一塊內存那樣來對待。因此,進程不必使用文件I/O操作,只需簡單的指針操作就可讀取和修改文件的內容。
Win32 API允許多個進程訪問同一文件映射對象,各個進程在它自己的地址空間里接收內存的指針。通過使用這些指針,不同進程就可以讀或修改文件的內容,實現了對文件中數據的共享。
應用程序有三種方法來使多個進程共享一個文件映射對象。
(1)繼承:第一個進程建立文件映射對象,它的子進程繼承該對象的句柄。
(2)命名文件映射:第一個進程在建立文件映射對象時可以給該對象指定一個名字(可與文件名不同)。第二個進程可通過這個名字打開此文件映射對象。另外,第一個進程也可以通過一些其它IPC機制(有名管道、郵件槽等)把名字傳給第二個進程。
(3)句柄復制:第一個進程建立文件映射對象,然後通過其它IPC機制(有名管道、郵件槽等)把對象句柄傳遞給第二個進程。第二個進程復制該句柄就取得對該文件映射對象的訪問許可權。
文件映射是在多個進程間共享數據的非常有效方法,有較好的安全性。但文件映射只能用於本地機器的進程之間,不能用於網路中,而開發者還必須控制進程間的同步。
2 共享內存
Win32 API中共享內存(Shared Memory)實際就是文件映射的一種特殊情況。進程在創建文件映射對象時用0xFFFFFFFF來代替文件句柄(HANDLE),就表示了對應的文件映射對象是從操作系統頁面文件訪問內存,其它進程打開該文件映射對象就可以訪問該內存塊。由於共享內存是用文件映射實現的,所以它也有較好的安全性,也只能運行於同一計算機上的進程之間。

注意點: 要控制同步,而且CString、list、arry、map等的collect class都不能安全的使用於共享內存中

不要把擁有虛函數之C++類放到共享內存中

不要把CObject派生類之MFC對象放到共享內存中

不要使用"point within the shared memory"的指針

不要使用"point outside of the shared memory"的指針

使用"based"指針是安全的,但要小心使用
3 匿名管道
管道(Pipe)是一種具有兩個端點的通信通道:有一端句柄的進程可以和有另一端句柄的進程通信。管道可以是單向-一端是只讀的,另一端點是只寫的;也可以是雙向的一管道的兩端點既可讀也可寫。
匿名管道(Anonymous Pipe)是 在父進程和子進程之間,或同一父進程的兩個子進程之間傳輸數據的無名字的單向管道。通常由父進程創建管道,然後由要通信的子進程繼承通道的讀端點句柄或寫 端點句柄,然後實現通信。父進程還可以建立兩個或更多個繼承匿名管道讀和寫句柄的子進程。這些子進程可以使用管道直接通信,不需要通過父進程。
匿名管道是單機上實現子進程標准I/O重定向的有效方法,它不能在網上使用,也不能用於兩個不相關的進程之間。
4 命名管道
命名管道(Named Pipe)是伺服器進程和一個或多個客戶進程之間通信的單向或雙向管道。不同於匿名管道的是命名管道可以在不相關的進程之間和不同計算機之間使用,伺服器建立命名管道時給它指定一個名字,任何進程都可以通過該名字打開管道的另一端,根據給定的許可權和伺服器進程通信。
命名管道提供了相對簡單的編程介面,使通過網路傳輸數據並不比同一計算機上兩進程之間通信更困難,不過如果要同時和多個進程通信它就力不從心了。
5 郵件槽
郵件槽(Mailslots)提 供進程間單向通信能力,任何進程都能建立郵件槽成為郵件槽伺服器。其它進程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽伺服器進程發送消息。進來的消 息一直放在郵件槽中,直到伺服器進程讀取它為止。一個進程既可以是郵件槽伺服器也可以是郵件槽客戶,因此可建立多個郵件槽實現進程間的雙向通信。
通過郵件槽可以給本地計算機上的郵件槽、其它計算機上的郵件槽或指定網路區域中所有計算機上有同樣名字的郵件槽發送消息。廣播通信的消息長度不能超過400位元組,非廣播消息的長度則受郵件槽伺服器指定的最大消息長度的限制。
郵件槽與命名管道相似,不過它傳輸數據是通過不可靠的數據報(如TCP/IP協議中的UDP包)完成的,一旦網路發生錯誤則無法保證消息正確地接收,而命名管道傳輸數據則是建立在可靠連接基礎上的。不過郵件槽有簡化的編程介面和給指定網路區域內的所有計算機廣播消息的能力,所以郵件槽不失為應用程序發送和接收消息的另一種選擇。
6 剪貼板
剪貼板(Clipped Board)實質是Win32 API中一組用來傳輸數據的函數和消息,為Windows應用程序之間進行數據共享提供了一個中介,Windows已建立的剪切(復制)-粘貼的機制為不同應用程序之間共享不同格式數據提供了一條捷徑。當用戶在應用程序中執行剪切或復制操作時,應用程序把選取的數據用一種或多種格式放在剪貼板上。然後任何其它應用程序都可以從剪貼板上拾取數據,從給定格式中選擇適合自己的格式。
剪貼板是一個非常鬆散的交換媒介,可以支持任何數據格式,每一格式由一無符號整數標識,對標准(預定義)剪貼板格式,該值是Win32 API定義的常量;對非標准格式可以使用Register Clipboard Format函數注冊為新的剪貼板格式。利用剪貼板進行交換的數據只需在數據格式上一致或都可以轉化為某種格式就行。但剪貼板只能在基於Windows的程序中使用,不能在網路上使用。
7 動態數據交換
動態數據交換(DDE)是使用共享內存在應用程序之間進行數據交換的一種進程間通信形式。應用程序可以使用DDE進行一次性數據傳輸,也可以當出現新數據時,通過發送更新值在應用程序間動態交換數據。
DDE和剪貼板一樣既支持標准數據格式(如文本、點陣圖等),又可以支持自己定義的數據格式。但它們的數據傳輸機制卻不同,一個明顯區別是剪貼板操作幾乎總是用作對用戶指定操作的一次性應答-如從菜單中選擇Paste命令。盡管DDE也可以由用戶啟動,但它繼續發揮作用一般不必用戶進一步干預。DDE有三種數據交換方式:
(1) 冷鏈:數據交換是一次性數據傳輸,與剪貼板相同。
(2) 溫鏈:當數據交換時伺服器通知客戶,然後客戶必須請求新的數據。
(3) 熱鏈:當數據交換時伺服器自動給客戶發送數據。
DDE交換可以發生在單機或網路中不同計算機的應用程序之間。開發者還可以定義定製的DDE數據格式進行應用程序之間特別目的IPC,它們有更緊密耦合的通信要求。大多數基於Windows的應用程序都支持DDE。
8 對象連接與嵌入
應用程序利用對象連接與嵌入(OLE)技術管理復合文檔(由多種數據格式組成的文檔),OLE提供使某應用程序更容易調用其它應用程序進行數據編輯的服務。例如,OLE支持的字處理器可以嵌套電子表格,當用戶要編輯電子表格時OLE庫可自動啟動電子表格編輯器。當用戶退出電子表格編輯器時,該表格已在原始字處理器文檔中得到更新。在這里電子表格編輯器變成了字處理器的擴展,而如果使用DDE,用戶要顯式地啟動電子表格編輯器。
同DDE技術相同,大多數基於Windows的應用程序都支持OLE技術。
9 動態連接庫
Win32動態連接庫(DLL)中的全局數據可以被調用DLL的所有進程共享,這就又給進程間通信開辟了一條新的途徑,當然訪問時要注意同步問題。
雖然可以通過DLL進行進程間數據共享,但從數據安全的角度考慮,我們並不提倡這種方法,使用帶有訪問許可權控制的共享內存的方法更好一些。
10 遠程過程調用
Win32 API提供的遠程過程調用(RPC)使應用程序可以使用遠程調用函數,這使在網路上用RPC進行進程通信就像函數調用那樣簡單。RPC既可以在單機不同進程間使用也可以在網路中使用。
由於Win32 API提供的RPC服從OSF-DCE(Open Software Foundation Distributed Computing Environment)標准。所以通過Win32 API編寫的RPC應用程序能與其它操作系統上支持DEC的RPC應用程序通信。使用RPC開發者可以建立高性能、緊密耦合的分布式應用程序。
11 NetBios函數
Win32 API提供NetBios函數用於處理低級網路控制,這主要是為IBM NetBios系統編寫與Windows的介面。除非那些有特殊低級網路功能要求的應用程序,其它應用程序最好不要使用NetBios函數來進行進程間通信。
12 Sockets
Windows Sockets規范是以U.C.Berkeley大學BSD UNIX中流行的Socket介面為範例定義的一套Windows下的網路編程介面。除了Berkeley Socket原有的庫函數以外,還擴展了一組針對Windows的函數,使程序員可以充分利用Windows的消息機制進行編程。
現在通過Sockets實現進程通信的網路應用越來越多,這主要的原因是Sockets的跨平台性要比其它IPC機制好得多,另外WinSock 2.0不僅支持TCP/IP協議,而且還支持其它協議(如IPX)。Sockets的唯一缺點是它支持的是底層通信操作,這使得在單機的進程間進行簡單數據傳遞不太方便,這時使用下面將介紹的WM_COPYDATA消息將更合適些。
13 WM_COPYDATA消息
WM_COPYDATA是一種非常強大卻鮮為人知的消息。當一個應用向另一個應用傳送數據時,發送方只需使用調用SendMessage函數,參數是目的窗口的句柄、傳遞數據的起始地址、WM_COPYDATA消息。接收方只需像處理其它消息那樣處理WM_COPY DATA消息,這樣收發雙方就實現了數據共享。
WM_COPYDATA是一種非常簡單的方法,它在底層實際上是通過文件映射來實現的。它的缺點是靈活性不高,並且它只能用於Windows平台的單機環境下。

Ⅱ ipc的進程間通信

IPC(Inter-Process Communication)進程間通信,提供了各種進程間通信的方法。在linux C編程中有幾種方法
(1) 半雙工Unix管道(2) FIFOs(命名管道)(3) 消息隊列(4) 信號量(5) 共享內存(6) 網路Socket
FIFOs是共享命名管道的資源,它是為了讓進程間通信而開放的命名管道,通過提供可信任的用戶名和口令,連接雙方可以建立安全的通道並以此通道進行加密數據的交換,從而實現對遠程計算機的訪問。IPC是NT/2000的一項新功能,它有一個特點,即在同一時間內,兩個IP之間只允許建立一個連接。NT/2000在提供了ipc功能的同時,在初次安裝系統時還打開了默認共享,即所有的邏輯共享(c,d,e……)和系統目錄winnt或windows(admin)共享。所有的這些,微軟的初衷都是為了方便管理員的管理,但在有意無意中,導致了系統安全性的降低。
平時我們總能聽到有人在說ipc漏洞,ipc漏洞,其實ipc並不是一個真正意義上的漏洞,我想之所以有人這么說,一定是指微軟自己安置的那個『後門』:空會話(Null session)。
網路入侵
IPC(Inter-Process Communication)網路入侵
為了幫助大家更好的學習IPC,我在這里特定整理及完善了一下IPC的概念、一些常用命令、在IPC出現在些問題的原因等等,資料大都來自網際網路,由於不知道作者名字,故不能標記內容來處,敬請見諒。
IPC的概念
空會話的概念
空會話是在沒有信任的情況下與伺服器建立的會話,對於一個空會話,LSA提供的令牌的SID(空會話的SID)是S-1-5-7,用戶名是:ANONYMOUS LOGON(系統內置的帳號),該訪問令牌包含下面偽裝的組:Everyone和Network。
IPC建立的過程
1)會話請求者(客戶)向會話接收者(伺服器)傳送一個數據包,請求安全隧道的建立;
2)伺服器產生一個隨機的64位數(實現挑戰)傳送回客戶;
3)客戶取得這個由伺服器產生的64位數,用試圖建立會話的帳號的口令打亂它,將結果返回到伺服器(實現響應);
4)伺服器接受響應後發送給本地安全驗證(LSA),LSA通過使用該用戶正確的口令來核實響應以便確認請求者身份。如果請求者的帳號是伺服器的本地帳號,核實本地發生;如果請求的帳號是一個域的帳號,響應傳送到域控制器去核實。當對挑戰的響應核實為正確後,一個訪問令牌產生,然後傳送給客戶。客戶使用這個訪問令牌連接到伺服器上的資源直到建議的會話被終止。
IPC連接條件
★ 跟操作系統相關(NT/2000/XP可以建立ipc$連接,98/ME不能建立ipc$連接);
★ 目標主機必須要開啟ipc$共享;
★本地主機必須要啟動Lanmanworkstation服務(功能為提供網路鏈結和通訊);
★ 目標主機必須要啟動Lanmanserver服務(ipc$依賴於此服務,它提供了 RPC 支持、文件、列印以及命名管道共享);
★ 目標主機必須要啟動NetLogon,它支持網路上計算機 pass-through 帳戶登錄身份;
★ 目標主機應該啟動NBT(打開139埠);
★ 目標主機防火牆配置(如果屏蔽139和445埠也將導致連接失敗);
★ 用戶名或者密碼錯誤;
★ 命令輸入錯誤(特別要注意空格的輸入,用戶名和密碼中不包含空格時兩邊的雙引號可以省略,密碼為空,直接輸入兩個引號);
★ 建立好連接後目標主機重啟,ipc$連接會自動斷開。
連接錯誤號分析
錯誤號5: 拒絕訪問,許可權不夠;
錯誤號51: 無法找到網路路徑(網路有問題);
錯誤號53: 找不到網路路徑(ip地址錯誤;目標主機未開機;目標主機lanmanserver服務未啟動;目標主機防火牆設置過濾埠);
錯誤號67: 找不到網路名(本地主機中lanmanworkstation服務未啟動或者目標主機刪除了ipc$);
錯誤號1219: 提供的憑據與已存在的憑據集沖突(已經建立了一個ipc$,可以刪除再連);
錯誤號1326: 用戶名或密碼錯誤;
錯誤號1792: 試圖登錄,網路登錄服務沒有啟動(目標主機中NetLogon服務未啟動);
錯誤號2242: 該用戶的密碼已經過期。
常用口令
★ 建立空連接: net use\IPipc$ /user:
★ 建立非空連接: net use\IPipc$password /user:username
★ 查看遠程主機的共享資源(但看不到默認共享) net view\IP
★ 查看本地主機的共享資源(可以看到本地的默認共享) net share
★ 得到遠程主機的用戶名列表 nbtstat -A IP
★ 得到本地主機的用戶列表 net user
★ 查看遠程主機的當前時間 net time\IP
★ 顯示本地主機當前服務 net start
★ 啟動/關閉本地服務 net start 服務名 /y net stop 服務名 /y
★ 映射遠程共享: net use z:\IPsihochina此命令將共享名為sihochina的共享資源映射到z盤
★ 刪除共享映射 net use z: /del /y 刪除映射的z盤net use * /del /y 刪除全部
★ 向遠程主機復制文件 路徑*.exe\IP共享目錄名,如: sihochina.exe\IPc將當前目錄下的sihochina.exe復制到對方c盤內
★ 遠程添加計劃任務 at\ip時間 程序名,如: at\192.168.0.111:00 sihochina.exe 11:00在主機192.168.0.1上運行sihochina.exe
本文所用的方法主要是在VISTA 旗艦版SP2以及XP SP2的環境下測試的,別的系統沒做測試,不過相信都大同小異,出現的問題也應該差不多,我將列舉我在兩個系統的實驗中所出現的所有問題供大家參考。
另外如果是初學者,對IPC及DOS命令毫無概念,請配合上一篇《IPC基礎及IPC-DOS命令》一起閱讀。

Ⅲ 進程間通信的操作

管道分為有名管道和無名管道,無名管道只能用於親屬進程之間的通信,而有名管道則可用於無親屬關系的進程之間。
在Linux系統下,命名管道可由兩種方式創建(假設創建一個名為「fifoexample」的有名管道):
(1)mkfifo(fifoexample,rw);
(2)mknod fifoexample p
mkfifo是一個函數,mknod是一個系統調用,即我們可以在shell下輸出上述命令。
有名管道創建後,我們可以像讀寫文件一樣讀寫它。
消息隊列用於運行於同一台機器上的進程間通信,與管道相似。 通常由一個進程創建,其餘進程對這塊內存區進行讀寫。得到共享內存有兩種方式:映射/dev/mem設備和內存映像文件。前一種方式不給系統帶來額外的開銷,但在現實中並不常用,因為它控制存取的是實際的物理內存;常用的方式是通過shmXXX函數族來實現共享內存:
int shmget(key_t key, int size, int flag);/* 獲得一個共享存儲標識符*/
該函數使得系統分配size大小的內存用作共享內存;
void *shmat(int shmid, void *addr, int flag); /* 將共享內存連接到自身地址空間中*/
如果一個進程通過fork創建了子進程,則子進程繼承父進程的共享內存,既而可以直接對共享內存使用,不過子進程可以自身脫離共享內存。
shmid為shmget函數返回的共享存儲標識符,addr和flag參數決定了以什麼方式來確定連接的地址,函數的返回值即是該進程數據段所連接的實際地址。此後,進程可以對此地址進行讀寫操作訪問共享內存。
對於共享內存,linux本身無法對其做同步,需要程序自己來對共享的內存做出同步計算,而這種同步很多時候就是用信號量實現。 本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。信號量,分為互斥信號量,和條件信號量。一般說來,為了獲得共享資源,進程需要執行下列操作:
(1)測試控制該資源的信號量;
(2)若此信號量的值為正,則允許進行使用該資源,進程將信號量減去所需的資源數;
(3)若此信號量為0,則該資源目前不可用,進程進入睡眠狀態,直至信號量值大於0,進程被喚醒,轉入步驟(1);
(4)當進程不再使用一個信號量控制的資源時,信號量值加其所佔的資源數,如果此時有進程正在睡眠等待此信號量,則喚醒此進程。 套接字通信並不為Linux所專有,在所有提供了TCP/IP協議棧的操作系統中幾乎都提供了socket,而所有這樣操作系統,對套接字的編程方法幾乎是完全一樣的。

Ⅳ linux進程間通訊的幾種方式

進程間通信(IPC,Interprocess communication)是一組編程介面,讓程序員能夠協調不同的進程,使之能在一個操作系統里同時運行,並相互傳遞、交換信息。這使得一個程序能夠在同一時間里處理許多用戶的要求。因為即使只有一個用戶發出要求,也可能導致一個操作系統中多個進程的運行,進程之間必須互相通話。IPC介面就提供了這種可能性。每個IPC方法均有它自己的優點和局限性,一般,對於單個程序而言使用所有的IPC方法是不常見的。
1、無名管道通信
無名管道(pipe):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用,進程的親緣關系通常是指父子進程關系。
2、高級管道通信
高級管道(popen):將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們稱為高級管道方式。
3、有名管道通信
有名管道(named pipe):有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
4、消息隊列通信
消息隊列(message
queue):消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識,消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
5、信號量通信
信號量(semophore):信號量是一個計數器,可以用來控制多個進程對共享資源的訪問,它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6、信號
信號(sinal):信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
7、共享內存通信
共享內存(shared
memory):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
8、套接字通信
套接字(socket):套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。

Ⅳ 如何用C#實現進程間通信

C#中建議用WCF,本地通信使用管道通信(並非必須),網路通信用TCP綁定。前提是你要知道WCF的基本概念。
service服務(包括web service)可以運行在任何一個.Net excutable上並且需要通過Interface調用,你可以把這個服務集成到你的本地窗體應用程序里,這樣在本地你就不需要進程間的通信了,節省很多工作量。如果非要分開,那麼要麼在你的本地窗體應用程序里新開一個Service來服務你的WebService,要麼調用底層SDK函數獲取窗體句柄然後發消息。當然還有其他的方式,比如文件共享、資料庫共享等。

另外看你的描述,「新建一個又新建一個」,如果這是你設計的系統結構,那麼建議你重新設計,好的軟體是在需求明確的情況下設計出來的,編程再其次。

熱點內容
按鍵腳本優化 發布:2024-05-19 04:59:57 瀏覽:750
怎麼下載壓縮包 發布:2024-05-19 04:47:47 瀏覽:9
二嫂水仙ftp 發布:2024-05-19 04:47:42 瀏覽:160
雲隙伺服器下載 發布:2024-05-19 04:33:22 瀏覽:315
德國C語言 發布:2024-05-19 04:13:40 瀏覽:963
音頻管理器沒有文件夾 發布:2024-05-19 04:13:36 瀏覽:667
qq郵箱埠993伺服器怎麼填 發布:2024-05-19 04:07:05 瀏覽:204
javaapi框架 發布:2024-05-19 04:06:59 瀏覽:363
與存儲結構無關的術語 發布:2024-05-19 04:05:41 瀏覽:500
編譯路由器固件選擇 發布:2024-05-19 03:56:28 瀏覽:42