c++裡面執行一個exe文件,匿名管道

来源:http://www.cnblogs.com/shouce/archive/2016/03/08/5252674.html
-Advertisement-
Play Games

操作系統的實驗要用到管道. 管道(Pipe)實際是用於進程間通信的一段共用記憶體,創建管道的進程稱為管道伺服器,連接到一個管道的進程為管道客戶機。一個進程在向管道寫入數據後,另一進程就可以從管道的另一端將其讀取出來。匿名管道(Anonymous Pipes)是在父進程和子進程間單向傳輸數據的一種未命名


操作系統的實驗要用到管道. 管道(Pipe)實際是用於進程間通信的一段共用記憶體,創建管道的進程稱為管道伺服器,連接到一個管道的進程為管道客戶機。一個進程在向管道寫入數據後,另一進程就可以從管道的另一端將其讀取出來。匿名管道(Anonymous Pipes)是在父進程和子進程間單向傳輸數據的一種未命名的管道,只能在本地電腦中使用,而不可用於網路間的通信。   匿名管道實施細則   匿名管道由CreatePipe()函數創建,該函數在創建匿名管道的同時返回兩個句柄:管道讀句柄和管道寫句柄。CreatePipe()的函數原型為:     BOOL CreatePipe(PHANDLE hReadPipe, // 指向讀句柄的指針    PHANDLE hWritePipe, // 指向寫句柄的指針    LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全屬性的指針    DWORD nSize // 管道大小   );   通過hReadPipe和hWritePipe所指向的句柄可分別以只讀、只寫的方式去訪問管道。  匿名管道並不支持非同步讀、寫操作,這也就意味著不能在匿名管道中使用ReadFileEx()和WriteFileEx(),而且ReadFile()和WriteFile()中的lpOverLapped參數也將被忽略。匿名管道將在讀、寫句柄都被關閉後退出,也可以在進程中調用CloseHandle()函數來關閉此句柄。 1.如果只想得到子進程的結果則可以只創建一個管道,然後ReadFile()得到輸出就行了。 如下:  STARTUPINFO si;   PROCESS_INFORMATION pi;   char ReadBuf[100];   DWORD ReadNum;   HANDLE hRead; // 管道讀句柄   HANDLE hWrite; // 管道寫句柄   BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 創建匿名管道   if (bRet == TRUE)    printf("成功創建匿名管道!\n");   else    printf("創建匿名管道失敗,錯誤代碼:%d\n", GetLastError());    // 得到本進程的當前標準輸出    HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);    // 設置標準輸出到匿名管道    SetStdHandle(STD_OUTPUT_HANDLE, hWrite);    GetStartupInfo(&si); // 獲取本進程的STARTUPINFO結構信息    bRet = CreateProcess(NULL, "Client.exe", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 創建子進程    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢複本進程的標準輸出    if (bRet == TRUE) // 輸入信息     printf("成功創建子進程!\n");    else     printf("創建子進程失敗,錯誤代碼:%d\n", GetLastError());     CloseHandle(hWrite); // 關閉寫句柄     // 讀管道直至管道關閉     while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))     {      ReadBuf[ReadNum] = '\0';      printf("從管道[%s]讀取%d位元組數據\n", ReadBuf, ReadNum);     }     if (GetLastError() == ERROR_BROKEN_PIPE) // 輸出信息      printf("管道被子進程關閉\n");     else      printf("讀數據錯誤,錯誤代碼:%d\n", GetLastError());   2.如果要想向子進程輸入數據則要為子進程的標準輸入也創建一個管道.再用WriteFile()輸入。 #include "Windows.h" #include "stdio.h" void main() { SECURITY_ATTRIBUTES sa,sa2; HANDLE hInputRead,hInputWrite; HANDLE hOutputRead,hOutputWrite; 
sa.nLength = sizeof(SECURITY_ATTRIBUTES);  sa.lpSecurityDescriptor = NULL;  sa.bInheritHandle = TRUE;    if (!CreatePipe(&hOutputRead,&hOutputWrite,&sa,0))  { printf("Error On CreatePipe1"); return; }  sa2.nLength = sizeof(SECURITY_ATTRIBUTES);  sa2.lpSecurityDescriptor = NULL; 
 sa2.bInheritHandle = TRUE;  if (!CreatePipe(&hInputRead,&hInputWrite,&sa2,0))  { printf("Error On CreatePipe2");  return;  } 
 STARTUPINFO si;  PROCESS_INFORMATION pi;  si.cb = sizeof(STARTUPINFO);  GetStartupInfo(&si);  si.hStdError = hOutputWrite; ///  si.hStdOutput = hOutputWrite; ///寫句柄賦予標準輸出(或標準錯誤)句柄  si.hStdInput = hInputRead; ///  //當父進程向子進程發送數據時,用SetStdHandle()  //將管道的讀句柄賦予標準輸入句柄;在從子進程接收數據時,  //則用SetStdHandle()將管道的寫句柄賦予標準輸出(或標準錯誤)句柄。  //然後,父進程可以調用進程創建函數CreateProcess()生成子進程。 //  如果父進程要發送數據到子進程,父進程可調用WriteFile() //  將數據寫入到管道(傳遞管道寫句柄給函數),子進程則調用GetStdHandle() //  取得管道的讀句柄,將該句柄傳入ReadFile()後從管道讀取數據。  si.wShowWindow = SW_HIDE;  si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;  DWORD dwWritten;  if (!CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe ",NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))  { printf("Error On CreateProcess");  return;  } 
 CloseHandle(hInputRead);  CloseHandle(hOutputWrite);  char szInPut[20] = "dir\r\n ";  // 父進程向子進程發送數據,輸入  WriteFile(hInputWrite, szInPut, strlen(szInPut), &dwWritten, NULL);  char buffer[4096] = {0};  DWORD bytesRead;  // 父進程向子進程得到數據,輸出   while (true)  { 
  if(ReadFile(hOutputRead,buffer,4095,&bytesRead,NULL) == NULL) 
 { break;  }     printf(buffer);   Sleep(500);  } 
 CloseHandle(hInputWrite);  CloseHandle(hOutputRead);}  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 關於混合C 和C++的編程方式,本人之前寫過一篇博客(參見 "混合語言編程:C 使用原生的Directx和OpenGL" ),在之前的博客中,介紹了在C 的Winform和WPF下使用原生的Direct和OpenGL進行繪圖,主要使用的方式是聲明一個函數為導出函數,然後就可以在C 中使用這個函
  • 在我前面很多關於Visio的開發過程中,介紹了各種Visio的C#開發應用場景,包括對Visio的文檔、模具文檔、形狀、屬性數據、各種事件等相關的基礎處理,以及Visio本身的整體項目應用,雖然時間過去很久,不過這些技術依舊還在使用中,最近應客戶培訓的需要,我對所有的內容進行了重新整理,把一些沒有介...
  • 委托是一種存儲函數引用的類型,在事件和事件的處理時有重要的用途 通俗的說,委托是一個可以引用方法的類型,當創建一個委托,也就創建一個引用方法的變數,進而就可以調用那個方法,即委托可以調用它所指的方法。 使用委托 委托的使用需要以下步驟: 定義委托 delegate double ParocessDe
  • 解決WPF Viewport3D透視模式時窗體模糊。
  • 最近做項目中往雲端伺服器上傳資源包文件的時候用到了Socket的通訊,便想把我是如何運用的和大家一起分享!這也是我的第一篇技術分享,哈哈,希望大家多多指點,我這裡只是客戶端的操作,所以只貼客戶端的代碼:
  • 當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,當前服務支持thrift服務框架。支持服務的註冊發現,服務調用的負載均衡,服務調用的監控。
  • <?/*抓取百度收錄代碼*/function baidu($s){ $baidu="http://www.baidu.com/s?wd=site%3A".$s; $site=file_get_contents($baidu); //$site=iconv("gb2312", "UTF-8", $si
  • 1 1.1 server: #!/use/local/env python# -*- coding:utf-8 -*-import socketip_port = ('127.0.0.1', 9999)#ip_port = ('0.0.0.0', 9999) #所有IPsk = socket.soc
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...