1. 程式人生 > >Windows程序通訊之一看就懂的匿名管道通訊

Windows程序通訊之一看就懂的匿名管道通訊

目錄

  • 程序通訊之一看就懂的匿名管道通訊
    • 一丶匿名管道
      • 1.1何為匿名管道
      • 1.2建立匿名管道需要注意的事項
      • 1.3 建立匿名管道需要的步驟
      • 1.4程式碼例子
      • 1.5程式碼執行截圖

程序通訊之一看就懂的匿名管道通訊

一丶匿名管道

1.1何為匿名管道

匿名管道是用來父程序跟子程序通訊的.還有一種是命名管道.不需要父子程序就可以進行通訊的.今天先說匿名管道的.
匿名管道. 就是父程序建立子程序. 讀取子程序資料.或者給子程序傳送資料.當然子程序也可以給父程序傳送資料.以及讀取父程序傳送過來的資料.

1.2建立匿名管道需要注意的事項

建立匿名管道,首先你要明白什麼是管道. 管道你可以想象成一個管子.
我們通過這個管子傳送資料.
如下圖所示:

通過上圖,我們就知道其實建立了兩個管道. 分別是父程序讀取的管道.以及
子程序讀取的管道.相應的.子程序也可以對父程序讀取的管道進行傳輸資料.父程序就可以讀取了.
這段話可能難以理解.你可以這樣想.

我父程序讀取子程序使用第一個管道. 那麼反正子程序寫的話也是使用第一個管道.因為子程序寫.我們父程序才能讀.

1.3 建立匿名管道需要的步驟

首先你需要了解建立匿名管道的API

WINBASEAPI
BOOL
WINAPI
CreatePipe(
    _Out_ PHANDLE hReadPipe,
    _Out_ PHANDLE hWritePipe,
    _In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
    _In_ DWORD nSize
    );

關於這個API很簡單.相比你過來看匿名管道.說明你已經知道這個API了.
只不過不知道管道概念.(我猜的);

這個API很簡單.就是建立管道. 兩個控制代碼.讀取控制代碼跟寫入控制代碼.
我們需要建立兩個管道.

還需要注意的是,父程序建立子程序,必須讓父程序控制代碼可繼承.這個就是第三個屬性.安全屬性描述符中給即可.

那麼說一下建立步驟吧.

1.建立一個安全屬性描述符,設定控制代碼可繼承
2.建立兩個管道. 父讀->子寫 子讀->父寫的
3.重定向輸出,將子程序的讀 以及子程序的寫重定向.
4.建立子程序
5.讀取\寫入資料給子程序.

1.4程式碼例子

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>





int main()
{

    HANDLE hParentRead, hParentWrite, hChildRead, hChildWrite; //建立4個控制代碼

    STARTUPINFO si = { 0 };                         //啟動資訊結構體
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = { 0 };                 //程序資訊結構體

    DWORD dwWritedBytes = 0;
    DWORD dwReadedBytes = 0;

    DWORD dwBytesRead = 0;
    DWORD dwTotalBytesAvail = 0;
    DWORD dwBytesLeftThisMessage = 0;

    SECURITY_ATTRIBUTES sa = { 0 };                //安全屬性描述符        
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;                      //設定控制代碼可繼承

    //建立管道1. 父程序讀 -> 子程序寫入
    BOOL bRet = CreatePipe(&hParentRead,
        &hChildWrite,
        &sa,
        0);

    //建立管道2.  子程序讀->父程序寫.
    bRet = CreatePipe(&hChildRead,
        &hParentWrite,
        &sa,
        0);

    //這裡將子程序寫重定向到 stdout中. 子程序讀取重定向到stdinput中
    si.hStdInput = hChildRead;    
    si.hStdOutput = hChildWrite;
    si.dwFlags = STARTF_USESTDHANDLES;   //設定視窗隱藏啟動

    

    bRet = CreateProcess(NULL,
        "cmd.exe",                      //建立cmd程序.預設尋找cmd程序.
        NULL,
        NULL,
        TRUE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi);

    char szBuffer[15] = "calc \n";
    WriteFile(hParentWrite, szBuffer, 15, NULL, 0);//使用writeFile操作管道,給cmd傳送資料命令.
    return 0;
}

1.5程式碼執行截圖

相關推薦

Windows程序通訊之一匿名管道通訊

目錄 程序通訊之一看就懂的匿名管道通訊 一丶匿名管道 1.1何為匿名管道 1.2建立匿名管道需要注意的事項 1.3 建立匿名管道需要的步驟 1.4程式碼例子 1

的手機APP開發教程

軟件開發 移動開發 界面 服務端 平臺 android 教程 效率 疑問 現在的移動互聯網屬於全民的狂歡時代,是每個人、每個用戶、每個企業的歡暢淋漓的時代,所以APP正在勢如破竹地開拓廣闊的市場。手機APP開發指的是專註於手機應用軟件開發與服務,是當前最為迫切的需求。無獨有

的ReactJs入門教程-精華版-轉載

角度 ice ets perf date 入門實例 view 此外 map 傳送門:http://www.cnblogs.com/yunfeifei/p/4486125.html   現在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了R

的Centos6.10安裝教程

定義 分區 屬於 虛擬 51cto 默認 救援模式 所有 博客 第一步將虛擬機安裝完畢後,運行虛擬機進行到這個界面下(虛擬機安裝及其配置,詳見論壇內的博客分享在這就不在陳述),:出現的是5條英文由上到下以此分別為:1.安裝或升級2.基本的顯卡驅動來安裝系統(在有些操作系統無

深入解讀HashMap,一

als 進行 get next 分配 行處理 而是 pac 代碼包 HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 接口的常用實現類,HashSet 是 Set 接口的常用實現類。

的Markdown語法

大氣 舉例 無法 .cn 拼音輸入法 數學公式 head 特點 thead 目錄 一、Markdown簡介 二、編輯工具推薦 三、語法 1.標題 2.列表 3.引用 4.加粗、斜體等 5.鏈接與圖片 6.更改圖片大小 7.代碼塊 8.表格 9.數學表達式 10.水平分割線

maven如何編譯(陳老師精講一

陳老師說了,沒強調的意味著現在不要花精力去研究,會用即可。後面不斷用它自然不就會了嗎。   maven被陳老師講完之後簡直太特麼簡單了,以下是步驟: 1. eclipse- new project--maven 建立maven專案 2. 一直next即可,group id就

!【英雄聯盟銳雯】與 Python 詳解設計模式之門面模式

【網路配圖】 設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。使用設計模式的目的:為了程式碼可重用性、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣

【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式(二)觀察者模式

觀察者模式概述 觀察者模式(有時又被稱為模型-檢視(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統

演算法的時間與空間複雜度(一

演算法(Algorithm)是指用來操作資料、解決程式問題的一組方法。對於同一個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。 那麼我們應該如何去衡量不同演算法之間的優劣呢? 主要還是從演算法所佔用的「時間」和「空間」兩個維度去考量。 時間維

算法的時間與空間復雜度(一

情況 com mage 符號表 分配 結果 ++i inf 容易 算法(Algorithm)是指用來操作數據、解決程序問題的一組方法。對於同一個問題,使用不同的算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。 那麽我們應該如何去衡量不同算法之

WaitForMultipleObjects用法詳解,一

原文:https://blog.csdn.net/sac761/article/details/52456385 WaitForMultipleObjects是Windows中的一個功能非常強大的函式,幾乎可以等待Windows中的所有的核心物件。 函式原型為: DWORD Wait

泛型一

public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list

RAID磁碟陣列是什麼(一

在單機時代,採用單塊磁碟進行資料儲存和讀寫的方式,由於定址和讀寫的時間消耗,導致I/O效能非常低,且儲存容量還會受到限制。另外,單塊磁碟極其容易出現物理故障,經常導致資料的丟失。因此大家就在想,有沒有一種辦法將多塊獨立的磁碟結合在一起組成一個技術方案,來提高資料的可靠性和I/O效能呢。 在這種情況下,R

【圖文解析】Spring瞭解一下啊,圖文解釋,一小老弟!

1.Spring簡介 什麼是Spring: spring產生於2003年,輕量級javase/ee一站式開源框架。 spring在三層架構的地位: 表示層:SpringMVC/struts2 業務邏輯層:Spring fra

,Python 日誌模組詳解及應用

日誌概述 百度百科的日誌概述: Windows網路作業系統都設計有各種各樣的日誌檔案,如應用程式日誌,安全日誌、系統日誌、Scheduler服務日誌、FTP日誌、WWW日誌、DNS伺服器日誌等等,這些根據你的系統開啟的服務的不同而有所不同。我們在系統上進行一些操作時,這些日誌檔案通常會記錄下我們操作的一些

作業系統-程序通訊(訊號量、匿名管道、命名管道、Socket)

程序通訊(訊號量、匿名管道、命名管道、Socket) 具體的概念就沒必要說了,參考以下連結。 訊號量 匿名管道 命名管道 Socket Source Code: 1. 訊號量(生產者消費者問題) 1 #include <iostream>

前端初學者一:Ajax呼叫後臺介面案例

一直以來很多初學者對於ajax呼叫後臺介面總是不能很明白,以下這個案例,能很清楚的過程展現給大家: 首先,要做這個功能前,我們必須先查閱後臺介面文件,瞭解使用登入介面時,需要提交哪些引數,並且介面使用返回的資料。  這裡我使用了一個返回json格式資料的登入介面為例,講解怎

2018年9月蘋果ios退款全部可用流程教程,非常詳細一,大家快進來看看

蘋果iOS內購退款2018年1月份開始相信大家都感覺得到他的退款金額和時間都被減少壓縮了,臨近過年了,很多遊戲開發商對蘋果公司的抱怨一直沒停,都要求蘋果公司把退款這樣機制取消,嚴重影響了他們的收益。蘋果公司在多個遊戲公司巨頭的施壓之下,也對退款這方面的要求進行了

詳細講解transform,一了!(贊)

前面我們一起學習了CSS3中的漸變、圓角、陰影等幾個屬性的使用,今天開始我們一起來學習有關於CSS3製作動畫的幾個屬性:等更高階的CSS3技術。本文主要介紹的是這三個屬性之中的第一個──變形transform。 Transform字面上就是變形,改變的意思。在CSS3中