Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

widgetman

macrumors member
Original poster
Oct 7, 2004
39
0
im really new at c++, but i know some very basic commands. i want to know how to run shell commands and return the result.

thank you.
 

bousozoku

Moderator emeritus
Jun 25, 2002
15,865
2,056
Lard
In C, you normally use various exec* or fork* functions to run external programmes. You should be able to use them within C++ to call the various shells.
 

iMeowbot

macrumors G3
Aug 30, 2003
8,634
0
For a simple shell script, system(3) is often all you need. Check the manual pages (man system in this case) in the SYNOPSIS section to see what #includes you need (just unistd.h in this case).

Note that system() always wraps /bin/sh around your command.

Code:
#include <iostream>
#include <unistd.h>

int
main()
{
    int rv = system("ls -l ~/");
    std::cout << "result code: " << rv << "\n";
    return 0;
}

Here's an example of doing it the hard way.
Code:
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int
main()
{
    int kidstatus, deadpid;

    pid_t kidpid = fork();
    if (kidpid == -1) {
        std::cerr << "fork error " << errno << ", "
                  << std::strerror(errno) << "\n";
        return 1;
    }
    if (kidpid == 0) {
        // okay, we're the child process. Let's transfer control
        // to the ls program.  "ls" in both of the spots in the list
        // is not a mistake!  Only the second argument on are argv.
        // note the NULL at the end of the list, you need that.
#if 0
        // this version uses the shell.
        int rv = execlp("/bin/sh", "/bin/sh", "-c", "ls -l /var/log", NULL);
#else
        // this version runs /bin/ls directly.
        int rv = execlp("/bin/ls", "/bin/ls", "-l", "/var/log/", NULL);
#endif
        // if the execlp is successful we never get here:
        if (rv == -1) {
            std::cerr << "execlp error " << errno << ", "
                      << std::strerror(errno) << "\n";
            return 99;
        }
        return 0;
    }
    // we only get here if we're the parent process.
    deadpid = waitpid(kidpid, &kidstatus, 0);
    if (deadpid == -1) {
        std::cerr << "waitpid error " << errno << ", "
                  << std::strerror(errno) << "\n";
        return 1;
    }
    std::cout << "child result code: " << WEXITSTATUS(kidstatus)
              << "\n";
    return 0;
}
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.