Page 1 of 1

Shell Commands

Posted: Mon Feb 23, 2009 1:12 pm
by Frosty
Okay, I wrote a basic program for shell commands.
Since alot of people were asking me how to do it.
This is a great reference for all you guys wanting to learn how to execute Shell commands in c++

Code: Select all

#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: Select all

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

Re: Shell Commands

Posted: Tue Feb 24, 2009 8:32 pm
by eatcomics
Sweet, I may be able to use this for my ipod linux development, if I choose to actually attempt it...