legongju.com
我们一直在努力
2025-01-09 23:38 | 星期四

如何在c++中处理cmd命令的长时间运行问题

在C++中处理CMD命令长时间运行的问题,可以通过创建一个子进程来执行命令,并使用管道(pipe)或共享内存(shared memory)来获取输出结果

#include
#include
#include 
#include
#include

#ifdef _WIN32
#include
#else
#include 
#endif

void runCommand(const std::string& cmd, std::string& output) {
    output.clear();

#ifdef _WIN32
    // Windows平台
    SECURITY_ATTRIBUTES sa = {sizeof(sa), NULL, TRUE};
    HANDLE hReadPipe, hWritePipe;
    CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);

    STARTUPINFO si = {sizeof(si)};
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdOutput = hWritePipe;
    si.hStdError = hWritePipe;
    si.wShowWindow = SW_HIDE;

    PROCESS_INFORMATION pi;
    if (CreateProcess(NULL, const_cast(cmd.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
        CloseHandle(hWritePipe);

        char buffer[1024];
        DWORD bytesRead;
        while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead) {
            buffer[bytesRead] = '\0';
            output += buffer;
        }

        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
    CloseHandle(hReadPipe);

#else
    // Unix平台
    int pipefd[2];
    pipe(pipefd);

    pid_t pid = fork();
    if (pid == 0) {
        close(pipefd[0]);
        dup2(pipefd[1], STDOUT_FILENO);
        dup2(pipefd[1], STDERR_FILENO);
        execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL);
        exit(1);
    } else {
        close(pipefd[1]);
        char buffer[1024];
        ssize_t bytesRead;
        while ((bytesRead = read(pipefd[0], buffer, sizeof(buffer) - 1)) > 0) {
            buffer[bytesRead] = '\0';
            output += buffer;
        }
        waitpid(pid, NULL, 0);
    }
    close(pipefd[0]);
#endif
}

int main() {
    std::string cmd = "ping www.example.com -n 10"; // 这里可以替换为你需要执行的命令
    std::string output;

    std::cout << "Running command: "<< cmd<< std::endl;
    runCommand(cmd, output);
    std::cout << "Command output:"<< std::endl<< output<< std::endl;

    return 0;
}

这个示例代码会创建一个子进程来执行指定的CMD命令,并通过管道(pipe)或共享内存(shared memory)来获取命令的输出结果。注意,这个示例代码只适用于Windows和Unix平台。如果你需要在其他平台上运行,请根据平台的特性进行相应的修改。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/88025.html

相关推荐

  • C++结合PaddleOCR实现图像文字提取

    C++结合PaddleOCR实现图像文字提取

    要使用C++结合PaddleOCR实现图像文字提取,你需要遵循以下步骤: 安装PaddlePaddle C++库 首先,你需要安装PaddlePaddle的C++库。这可以通过编译源代码或从官方网...

  • 如何优化C++中PaddleOCR的识别效果

    如何优化C++中PaddleOCR的识别效果

    要优化C++中PaddleOCR的识别效果,可以采取以下措施: 优化模型选择:选择更加轻量级和高效的模型,例如MobileNetV3、ResNet等。同时,可以使用更大的数据集进行...

  • PaddleOCR在C++环境下的安装与配置

    PaddleOCR在C++环境下的安装与配置

    PaddleOCR是一个基于飞桨(PaddlePaddle)的开源文本识别库,可以用于文本检测、文本识别等任务 安装PaddlePaddle C++预测库 首先,你需要从PaddlePaddle官网下载...

  • 如何避免C++工厂模式的常见陷阱

    如何避免C++工厂模式的常见陷阱

    在使用C++工厂模式时,有一些常见的陷阱和错误需要注意。以下是一些建议,可以帮助你避免这些问题: 不要将工厂类设计为全局单例:过度依赖全局状态会导致代码难...

  • c++中执行cmd命令的性能优化有哪些方法

    c++中执行cmd命令的性能优化有哪些方法

    在C++中执行CMD命令时,性能优化可以从以下几个方面进行: 避免不必要的系统调用:尽量减少使用system()函数或者其他需要创建子进程的方法来执行CMD命令。这样可...

  • 如何在c++中捕获cmd命令的输出并解析

    如何在c++中捕获cmd命令的输出并解析

    要在C++中捕获cmd命令的输出并解析,你可以使用popen()函数
    #include
    #include
    #include int main() { // 创建一个包含命令的字符串 std::string...

  • 如何优化get命令的性能

    如何优化get命令的性能

    要优化GET命令的性能,可以采取以下措施: 使用HTTP/2协议:相比于HTTP/1.1,HTTP/2具有更高的传输速度和并发能力。使用HTTP/2可以显著提高网站的加载速度。 开启...

  • 如何通过get命令获取目录列表

    如何通过get命令获取目录列表

    要通过get命令获取目录列表,您可以使用ls或dir命令
    ls /path/to/directory 或者在Windows系统中:
    dir C:\path\to\directory 这将显示指定目录下的所...