legongju.com
我们一直在努力
2024-12-23 21:13 | 星期一

c++ exec如何处理输入

在C++中,你可以使用exec函数族来执行外部命令并处理其输出

#include 
#include 
#include 
#include 
#include 

int main() {
    std::vector args = {"ls", "-l"}; // 示例命令:列出当前目录的文件

    pid_t pid = fork(); // 创建子进程

    if (pid == 0) { // 子进程
        execvp(args[0].c_str(), args.data()); // 执行命令
        perror("execvp"); // 如果执行失败,打印错误信息
        exit(EXIT_FAILURE); // 退出子进程
    } else if (pid > 0) { // 父进程
        int status;
        waitpid(pid, &status, 0); // 等待子进程完成
        if (WIFEXITED(status)) { // 检查子进程是否正常退出
            std::cout << "子进程返回状态: " << WEXITSTATUS(status) << std::endl;
        } else {
            std::cerr << "子进程异常退出" << std::endl;
        }
    } else { // fork失败
        perror("fork");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

在这个示例中,我们使用fork()创建了一个子进程,然后在子进程中使用execvp()执行了一个ls -l命令。父进程会等待子进程完成,并检查其返回状态。

如果你需要从标准输入读取数据并将其传递给外部命令,可以使用popen()pclose()函数。例如:

#include 
#include 
#include 

int main() {
    std::istringstream input("file.txt"); // 从文件创建输入流
    std::streambuf* cinbuf = std::cin.rdbuf(); // 保存原始标准输入缓冲区
    std::cin.rdbuf(input.rdbuf()); // 将标准输入缓冲区替换为文件输入流

    FILE* pipe = popen("grep example", "r"); // 执行命令并获取管道
    if (!pipe) {
        std::cerr << "popen() failed!" << std::endl;
        return EXIT_FAILURE;
    }

    char buffer[128];
    while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
        std::cout << buffer;
    }

    pclose(pipe); // 关闭管道
    std::cin.rdbuf(cinbuf); // 恢复原始标准输入缓冲区

    return EXIT_SUCCESS;
}

在这个示例中,我们使用popen()执行了一个grep example命令,并将标准输入替换为一个文件输入流。然后我们从该流中读取数据并将其输出到标准输出。最后,我们使用pclose()关闭管道并恢复原始标准输入缓冲区。

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

相关推荐

  • c# taskscheduler有哪些触发方式

    c# taskscheduler有哪些触发方式

    C#中的TaskScheduler类提供了多种触发任务的方式,主要包括以下几种: 固定间隔触发:通过TaskScheduler.CreatePeriodicTask方法创建一个周期性执行的任务。这个...

  • c# taskscheduler能定时执行复杂操作吗

    c# taskscheduler能定时执行复杂操作吗

    是的,C# 的 TaskScheduler 类可以用于定时执行复杂操作。TaskScheduler 是一个抽象类,它提供了在特定的线程池中调度和执行任务的功能。你可以使用 TaskSchedul...

  • c# taskscheduler怎样设置定时任务

    c# taskscheduler怎样设置定时任务

    在C#中,你可以使用System.Threading.Tasks.TaskScheduler类来创建和管理定时任务。以下是一个简单的示例,展示了如何使用TaskScheduler创建一个定时任务,每隔一...

  • c# taskscheduler安全吗

    c# taskscheduler安全吗

    C#的TaskScheduler类是.NET Framework中用于调度和执行异步任务的一个类,它本身是安全的,并且提供了灵活的任务管理功能。然而,安全性取决于如何使用它。以下是...

  • linux java路径会影响系统吗

    linux java路径会影响系统吗

    在Linux系统中,Java路径通常不会直接影响系统
    Java路径主要用于告诉系统如何找到Java运行时环境(JRE)和Java开发工具包(JDK)。当你在Linux系统中安装Ja...

  • linux java路径怎样恢复

    linux java路径怎样恢复

    如果你不小心删除了 Linux 系统中的 Java 路径,可以通过以下步骤来恢复它: 首先,检查你的系统是否已经安装了 Java。在终端中输入以下命令: java -version 如...

  • linux java路径如何备份

    linux java路径如何备份

    在Linux系统中,备份Java路径主要有两种方法:使用update-alternatives命令或者手动备份
    方法1:使用update-alternatives命令
    update-alternatives命令...

  • java调用c号数据如何加密

    java调用c号数据如何加密

    在Java中调用C代码进行加密,可以使用Java Native Interface (JNI)技术。JNI允许Java代码与本地代码(如C和C++)进行交互。以下是一个简单的示例,展示了如何在J...