溫馨提示×

c++ exec如何處理輸入

c++
小樊
103
2024-12-01 15:36:16
欄目: 編程語言

在C++中,你可以使用exec函數族來執行外部命令并處理其輸出

#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    std::vector<std::string> 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 <iostream>
#include <sstream>
#include <cstdio>

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()關閉管道并恢復原始標準輸入緩沖區。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女