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