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

末鹿安然 提交于 2020-01-14 09:14:25

问题


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();

回答1:


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!




回答2:


Not an expert on this myself, but if you look at the man page for system:

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

You can go into the background within the command/script you're executing (and return immediately), but I don't think there's a specific provision in system for that case.

Ideas I can think of are:

  1. Your command might return the pid through the return code.
  2. Your code might want to look up the name of the command in the active processes (e.g. /proc APIs in unix-like environments).
  3. You might want to launch the command yourself (instead of through a SHELL) using fork/exec



回答3:


You can check exit status of your command by following code :

int ret = system("./my_script");

if (WIFEXITED(ret) && !WEXITSTATUS(ret))
{
    printf("Completed successfully\n"); ///successful 
}
else
{
    printf("execution failed\n"); //error
}


来源:https://stackoverflow.com/questions/22802902/how-to-get-pid-of-process-executed-with-system-command-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!