Как получить вывод из других программ с интерфейсом командной строки?

Хорошо, я провел небольшое исследование и не смог найти ничего полезного. Я пытаюсь написать программу, которая будет получать данные от 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, и зафиксировать ее вывод?


person user3897031    schedule 31.07.2014    source источник
comment
Добро пожаловать в StackOverflow! Вы можете сократить свой пост, так как он содержит много посторонней информации. Ваш вопрос, кажется, действительно спрашивает, как вы можете запустить iwconfig и зафиксировать его вывод, поэтому большая часть информации в верхнем абзаце не нужна. Однако иметь код и описание того, что не работает, — это здорово, поэтому мы надеемся, что кто-то сможет вам помочь.   -  person Mike Precup    schedule 31.07.2014


Ответы (1)


"Может кто-нибудь объяснить, как запустить такую ​​программу, как 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 pipe\n";
        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 input\n";
            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 output\n";
            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 child\n";
            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] = '\0';
            receive_output += readbuffer;
        }

        close(fd_c2p[0]);
        cout << "From child: <<" << receive_output << ">>" << endl;
    }
    return 0;
}
person πάντα ῥεῖ    schedule 31.07.2014