How to start a executable within a C++ program and get its process id (in linux)?

c++, linux

Solution

In the parent process you want to `fork`.

Fork creates an entirely new process and returns either the child process's `pid` to the calling process, and `0` to the new child process.

In the child process you can then use something like `execl` to execute your desired secondary program. In the parent process you can use `waitpid` to wait for the child to complete.

Here is a simple illustrative example:

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <cstdio>
#include <cstdlib>

int main()
{
    std::string cmd = "/bin/ls"; // secondary program you want to run

    pid_t pid = fork(); // create child process
    int status;

    switch (pid)
    {
    case -1: // error
        perror("fork");
        exit(1);

    case 0: // child process
        execl(cmd.c_str(), 0, 0); // run the command
        perror("execl"); // execl doesn't return unless there is a problem
        exit(1);

    default: // parent process, pid now contains the child pid
        while (-1 == waitpid(pid, &status, 0)); // wait for child to complete
        if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
        {
            // handle error
            std::cerr << "process " << cmd << " (pid=" << pid << ") failed" << std::endl;
        }
        break;
    }
    return 0;
}

Problem

i tried system(), but somehow when the secondary program runs, my main program(primary program which executes the secondary) hangs and second issue is how do i obtain the process id of the secondary program in my main program?

Original source