如何从其他命令行接口程序获得输出

How to get output from other command line interface programs?

本文关键字:输出 程序 命令行接口 其他      更新时间:2023-10-16

好的,我做了一些调查,但没有发现任何有用的东西。我正试图编写一个程序,将从iwconfig(在linux机器上)接收输入。然后,它将对输入进行排序,进行一些计算并输出到数据库。对输入和输出进行排序不是问题(或者我真的希望不是),但我正在努力从另一个命令行程序读取输入。我现在的基本Hello World程序是:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    int main() {
        int numbr = 0;
        cout << "Hello world!" << endl;
        cin >> numbr;
        cout << "number is " << numbr;
        cout << system("iwconfig");
        return 0; 
    }

然而,在运行程序时,它所做的只是输出hello world,请求我的随机输入并再次输出。它不输出iwconfig(我还将这行运行为system("iwconfig");没有输出语句)。有人会好心地解释我如何运行一个程序,如iwconfig和捕获它的输出?

"有没有人能解释一下我如何运行像iwconfig这样的程序并捕获它的输出?"

检查int system( const char *command );文档。它当然不提供返回值,您想用cout语句输出。

您可能希望在您的主程序和iwconfig程序之间建立管道,如这里描述的,以控制子进程使用的输入和输出流。

复制上述答案改编:

int main() {
    int fd_p2c[2], fd_c2p[2], bytes_read;
    pid_t childpid;
    char readbuffer[80];
    string program_name = "iwconfig";
    string receive_output = "";
    if (pipe(fd_p2c) != 0 || pipe(fd_c2p) != 0) {
        cerr << "Failed to pipen";
        exit(1);
    }
    childpid = fork();
    if (childpid < 0) {
        cout << "Fork failed" << endl;
        exit(-1);
    }
    else if (childpid == 0) {
        if (dup2(fd_p2c[0], 0) != 0 ||
            close(fd_p2c[0]) != 0 ||
            close(fd_p2c[1]) != 0) {
            cerr << "Child: failed to set up standard inputn";
            exit(1);
        }
        if (dup2(fd_c2p[1], 1) != 1 ||
            close(fd_c2p[1]) != 0 ||
            close(fd_c2p[0]) != 0) {
            cerr << "Child: failed to set up standard outputn";
            exit(1);
        }
        execl(program_name.c_str(), program_name.c_str(), (char *) 0);
        cerr << "Failed to execute " << program_name << endl;
        exit(1);
    }
    else {
        close(fd_p2c[0]);
        close(fd_c2p[1]);
        cout << "Writing to child: <<" << gulp_command << ">>" << endl;
        int nbytes = gulp_command.length();
        if (write(fd_p2c[1], gulp_command.c_str(), nbytes) != nbytes) {
            cerr << "Parent: short write to childn";
            exit(1);
        }
        close(fd_p2c[1]);
        while (1) {
            bytes_read = read(fd_c2p[0], readbuffer, sizeof(readbuffer)-1);
            if (bytes_read <= 0) break;
            readbuffer[bytes_read] = '';
            receive_output += readbuffer;
        }
        close(fd_c2p[0]);
        cout << "From child: <<" << receive_output << ">>" << endl;
    }
    return 0;
}