进程间通信(4) 匿名管道
- 匿名管道沒有名稱,所以只能在父進(jìn)程中調(diào)用CreateProcess函數(shù)創(chuàng)建子進(jìn)程時(shí),將管道的讀、寫句柄傳遞給子進(jìn)程。
- 匿名管道只能實(shí)現(xiàn)本地機(jī)器上兩個(gè)進(jìn)程間的通信,而不能實(shí)現(xiàn)跨網(wǎng)絡(luò)的通信。
1. 過程:
- a. createpipe得到hWrite和hRead兩句柄
- b. 將hWrite和hRead通過createprocess傳遞給子進(jìn)程
- c. 子進(jìn)程通過GetStdHandle獲取 hWrite和hRead
- d. 你讀我寫
2. api詳細(xì)說明
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
參數(shù),也可將lpApplicationName設(shè)為Null,此lpCommandLine指定name,
eg.
“c:\program fileslsub dir\program name”=>
c:lprogram.exe fileslsub dirlprogram name
…
Windows將按照如下順序?qū)ふ疫@個(gè)可執(zhí)行文件:
1.當(dāng)前應(yīng)用程序的目錄。
2.父進(jìn)程的目錄。
3. Windows 95:Windows系統(tǒng)目錄,可以使用 GetSystemDirectory函數(shù)獲得。
Windows NT:32位Windows系統(tǒng)目錄。可以使用GetSystemDirectory函數(shù)獲得,目錄名是SYSTEM32。
4. 在Windows NT中:16位Windows系統(tǒng)目錄。不可以使用Win32函數(shù)獲得這個(gè)目錄,但是它會(huì)被搜索,目錄名是SYSTEM。
5.Windows目錄。可以使用 GetWindowsDirectory函數(shù)獲得這個(gè)目錄。
6.列在PATH環(huán)境變量中的目錄。
-
bInheritHandles
子進(jìn)程是否從父進(jìn)程繼承句柄 -
dwCreationFlags
值:DEBUG_PROCESS
如果這個(gè)標(biāo)志被設(shè)置,調(diào)用進(jìn)程將被當(dāng)作一個(gè)調(diào)試程序,并且新進(jìn)程會(huì)被當(dāng)作被調(diào)試的進(jìn)程。系統(tǒng)把被調(diào)試程序發(fā)生的所有調(diào)試事件通知給調(diào)試器。如果你使用這個(gè)標(biāo)志創(chuàng)建進(jìn)程,只有調(diào)用進(jìn)程(調(diào)用CreateProcess函數(shù)的進(jìn)程)可以調(diào)用WaitForDebugEvent函數(shù)。
值:DEBUG_ONLY_THIS_PROCESS
含義:如果此標(biāo)志沒有被設(shè)置且調(diào)用進(jìn)程正在被調(diào)試,新進(jìn)程將成為調(diào)試調(diào)用進(jìn)程的調(diào)試器的另一個(gè)調(diào)試對象。如果調(diào)用進(jìn)程沒有被調(diào)試,有關(guān)調(diào)試的行為就不會(huì)產(chǎn)生。
值:DETACHED_PROCESS
含義:對于控制臺進(jìn)程,新進(jìn)程沒有訪問父進(jìn)程控制臺的權(quán)限。新進(jìn)程可以通過AllocConsole函數(shù)自己創(chuàng)建一個(gè)新的控制臺。這個(gè)標(biāo)志不可以與CREATE_NEW_CONSOLE標(biāo)志一起使用。
還可表示進(jìn)程優(yōu)先級
- lpStartupInfo
用于決定新進(jìn)程的主窗體如何顯示的STARTUPINFO結(jié)構(gòu)體
- LPPROCESS_INFORMATION lpProcessInformation
子進(jìn)程的句柄數(shù)據(jù)
dwProcessId,dwThreadId需要程序員手動(dòng)CloseHandle
在創(chuàng)建一個(gè)新進(jìn)程時(shí),系統(tǒng)會(huì)為該進(jìn)程建立一個(gè)進(jìn)程內(nèi)核對象和一個(gè)線程內(nèi)核對象,而內(nèi)核對象都有一個(gè)使用計(jì)數(shù),系統(tǒng)會(huì)為這兩個(gè)對象賦予初始的使用計(jì)數(shù):1,當(dāng)CreateProcess 函數(shù)在其內(nèi)部打開這些對象時(shí),每個(gè)對象的使用計(jì)數(shù)就變?yōu)?
【引用】
總結(jié)
以上是生活随笔為你收集整理的进程间通信(4) 匿名管道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间通信(3) 剪贴板
- 下一篇: 区块链BaaS云服务(11)招商银行AB