日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信(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
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) 匿名管道的全部內容,希望文章能夠幫你解決所遇到的問題。

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