Search code examples
c++processpid

How to get pid of process executed with system() command in c++


When we use system() command, program wait until it complete but I am executing a process using system() and using load balance server due to which program comes to next line just after executing system command. Please note that that process may not be complete.

system("./my_script");

// after this I want to see whether it is complete or not using its pid.
// But how do i Know PID?
IsScriptExecutionComplete();

Solution

  • Simple answer: you can't.

    The purpose of system() is to block when command is being executed.

    But you can 'cheat' like this:

    pid_t system2(const char * command, int * infp, int * outfp)
    {
        int p_stdin[2];
        int p_stdout[2];
        pid_t pid;
    
        if (pipe(p_stdin) == -1)
            return -1;
    
        if (pipe(p_stdout) == -1) {
            close(p_stdin[0]);
            close(p_stdin[1]);
            return -1;
        }
    
        pid = fork();
    
        if (pid < 0) {
            close(p_stdin[0]);
            close(p_stdin[1]);
            close(p_stdout[0]);
            close(p_stdout[1]);
            return pid;
        } else if (pid == 0) {
            close(p_stdin[1]);
            dup2(p_stdin[0], 0);
            close(p_stdout[0]);
            dup2(p_stdout[1], 1);
            dup2(::open("/dev/null", O_RDONLY), 2);
            /// Close all other descriptors for the safety sake.
            for (int i = 3; i < 4096; ++i)
                ::close(i);
    
            setsid();
            execl("/bin/sh", "sh", "-c", command, NULL);
            _exit(1);
        }
    
        close(p_stdin[0]);
        close(p_stdout[1]);
    
        if (infp == NULL) {
            close(p_stdin[1]);
        } else {
            *infp = p_stdin[1];
        }
    
        if (outfp == NULL) {
            close(p_stdout[0]);
        } else {
            *outfp = p_stdout[0];
        }
    
        return pid;
    }
    

    Here you can have not only PID of the process, but also it's STDIN and STDOUT. Have fun!