-1

Ok I did some research and I couldn't turn up anything useful. I am trying to write a program that will receive input from iwconfig (on a linux machine). It will then sort through the input, do some calculations and output to a database. Sorting through the input and outputting isn't an issue (or so I really hope it not to be) but what I am struggling with is reading input from another command line program. What I have right now as a base Hello World program is:

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

However upon running the program, all it does is output hello world, ask for my random input and output it again. It does not output iwconfig (I also ran the line as just system("iwconfig"); without the output statement). Would someone be kind enough to explain how I could run a program like iwconfig and capture it's output?

πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190
  • Welcome to StackOverflow! You may want to trim down your post, since it has a lot of extraneous information. Your question seems to be really asking how you can run `iwconfig` and capture its output, so most of the information in the top paragraph is unnecessary. Having code and a description of what's not working is great, though, so here's hoping someone can help you out. – Mike Precup Jul 31 '14 at 19:28

1 Answers1

0

"Would someone be kind enough to explain how I could run a program like iwconfig and capture it's output?"

Check the int system( const char *command ); documentation. It certainly doesn't provide to return the value, you want to output with your cout statement.

You probably want to have pipes established between your main and the iwconfig program, as described here, to control the input and output streams used by the child process.

To replicate the mentioned answer adapted:

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;
}
Community
  • 1
  • 1
πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190