日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

进程间通信(4) 匿名管道

發布時間:2025/3/21 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信(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系統目錄??梢允褂肎etSystemDirectory函數獲得,目錄名是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
typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;

用于決定新進程的主窗體如何顯示的STARTUPINFO結構體

  • LPPROCESS_INFORMATION lpProcessInformation
    子進程的句柄數據
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION;

dwProcessId,dwThreadId需要程序員手動CloseHandle

在創建一個新進程時,系統會為該進程建立一個進程內核對象和一個線程內核對象,而內核對象都有一個使用計數,系統會為這兩個對象賦予初始的使用計數:1,當CreateProcess 函數在其內部打開這些對象時,每個對象的使用計數就變為2

【引用】

  • 代碼 https://github.com/thefistlei/os/tree/main/processCommunication/anonymousPipe
  • VC++ 深入詳解 孫鑫
  • CreatePipe function (namedpipeapi.h)https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-createpipe
  • 總結

    以上是生活随笔為你收集整理的进程间通信(4) 匿名管道的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。