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

Хорошо, я провел небольшое исследование и не смог найти ничего полезного. Я пытаюсь написать программу, которая будет получать входные данные от 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»); без оператора output). Будет ли кто-нибудь достаточно любезен, чтобы объяснить, как я могу запустить такую ​​программу, как iwconfig, и записать ее вывод?

-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;
}
0

Другие решения


По вопросам рекламы [email protected]