进程间通信(4) 匿名管道
- 匿名管道沒有名稱,所以只能在父進程中調用CreateProcess函數創建子進程時,將管道的讀、寫句柄傳遞給子進程。
- 匿名管道只能實現本地機器上兩個進程間的通信,而不能實現跨網絡的通信。
1. 過程:
- a. createpipe得到hWrite和hRead兩句柄
- b. 將hWrite和hRead通過createprocess傳遞給子進程
- c. 子進程通過GetStdHandle獲取 hWrite和hRead
- d. 你讀我寫
2. api詳細說明
read:
char buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL))write:
char buf[]="匿名管道測試程序";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)) BOOL CreatePipe(PHANDLE hReadPipe,PHANDLE hWritePipe,LPSECURITY_ATTRIBUTES lpPipeAttributes,DWORD nSize );typedef struct _SECURITY_ATTRIBUTES {DWORD nLength;LPVOID lpSecurityDescriptor;BOOL bInheritHandle; } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; BOOL WINAPI CreateProcess(_In_opt_ LPCTSTR lpApplicationName,_Inout_opt_ LPTSTR lpCommandLine,_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_ BOOL bInheritHandles,_In_ DWORD dwCreationFlags,_In_opt_ LPVOID lpEnvironment,_In_opt_ LPCTSTR lpCurrentDirectory,_In_ LPSTARTUPINFO lpStartupInfo,_Out_ LPPROCESS_INFORMATION lpProcessInformation );-
lpApplicationName
指定某路徑下exe,若路徑包括空格,則語義改變。 -
lpCommandLine
參數,也可將lpApplicationName設為Null,此lpCommandLine指定name,
eg.
“c:\program fileslsub dir\program name”=>
c:lprogram.exe fileslsub dirlprogram name
…
Windows將按照如下順序尋找這個可執行文件:
1.當前應用程序的目錄。
2.父進程的目錄。
3. Windows 95:Windows系統目錄,可以使用 GetSystemDirectory函數獲得。
Windows NT:32位Windows系統目錄。可以使用GetSystemDirectory函數獲得,目錄名是SYSTEM32。
4. 在Windows NT中:16位Windows系統目錄。不可以使用Win32函數獲得這個目錄,但是它會被搜索,目錄名是SYSTEM。
5.Windows目錄。可以使用 GetWindowsDirectory函數獲得這個目錄。
6.列在PATH環境變量中的目錄。
-
bInheritHandles
子進程是否從父進程繼承句柄 -
dwCreationFlags
值:DEBUG_PROCESS
如果這個標志被設置,調用進程將被當作一個調試程序,并且新進程會被當作被調試的進程。系統把被調試程序發生的所有調試事件通知給調試器。如果你使用這個標志創建進程,只有調用進程(調用CreateProcess函數的進程)可以調用WaitForDebugEvent函數。
值:DEBUG_ONLY_THIS_PROCESS
含義:如果此標志沒有被設置且調用進程正在被調試,新進程將成為調試調用進程的調試器的另一個調試對象。如果調用進程沒有被調試,有關調試的行為就不會產生。
值:DETACHED_PROCESS
含義:對于控制臺進程,新進程沒有訪問父進程控制臺的權限。新進程可以通過AllocConsole函數自己創建一個新的控制臺。這個標志不可以與CREATE_NEW_CONSOLE標志一起使用。
還可表示進程優先級
- lpStartupInfo
用于決定新進程的主窗體如何顯示的STARTUPINFO結構體
- LPPROCESS_INFORMATION lpProcessInformation
子進程的句柄數據
dwProcessId,dwThreadId需要程序員手動CloseHandle
在創建一個新進程時,系統會為該進程建立一個進程內核對象和一個線程內核對象,而內核對象都有一個使用計數,系統會為這兩個對象賦予初始的使用計數:1,當CreateProcess 函數在其內部打開這些對象時,每個對象的使用計數就變為2
【引用】
總結
以上是生活随笔為你收集整理的进程间通信(4) 匿名管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间通信(3) 剪贴板
- 下一篇: 区块链BaaS云服务(11)招商银行AB