Bootstrap

【管道】c++写一个管道父应用 发命令dir运行子应用cmd.exe并获取子应用的响应

在这里插入图片描述
下面是一个用 C++ 编写的示例代码,展示了如何创建一个管道父应用,发出命令 dir 运行子应用 cmd.exe 并获取子应用的响应。

#include <windows.h>
#include <iostream>
#include <string>

int main() {
    // 创建管道
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
        std::cerr << "CreatePipe failed." << std::endl;
        return 1;
    }

    // 设置子进程的安全属性
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    si.hStdOutput = hWritePipe; // 将子进程的标准输出重定向到管道
    si.hStdError = hWritePipe;   // 将子进程的标准错误重定向到管道
    si.dwFlags |= STARTF_USESTDHANDLES;

    // 创建子进程
    if (!CreateProcess(NULL, (LPSTR)"cmd.exe /C dir", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
        std::cerr << "CreateProcess failed." << std::endl;
        return 1;
    }

    // 关闭写入端
    CloseHandle(hWritePipe);

    // 读取子进程的输出
    char buffer[128];
    std::string output;
    DWORD bytesRead;

    while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead > 0) {
        buffer[bytesRead] = '\0'; // 确保字符串以 null 结尾
        output += buffer; // 将输出追加到字符串
    }

    // 关闭读取端和子进程句柄
    CloseHandle(hReadPipe);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    // 输出子进程的响应
    std::cout << "Output from cmd.exe:\n" << output << std::endl;

    return 0;
}

代码说明:

  1. 创建管道:使用 CreatePipe 函数创建一个管道,用于父进程和子进程之间的通信。
  2. 设置子进程的标准输出:通过 STARTUPINFO 结构体将子进程的标准输出和标准错误重定向到管道的写入端。
  3. 创建子进程:使用 CreateProcess 函数启动 cmd.exe,并执行 dir 命令。
  4. 读取输出:从管道的读取端读取子进程的输出,并将其存储在字符串中。
  5. 输出结果:最后,将子进程的输出打印到控制台。

请确保在 Windows 环境中编译和运行此代码。

;