如何在c ++中使用system()命令获取进程的pid

时间:2014-04-02 06:11:51

标签: c++ process pid

当我们使用system()命令时,程序会一直等到它完成但是我正在使用process并使用负载平衡服务器执行system(),因为在执行之后哪个程序到达下一行系统命令。请注意,process可能不完整。

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

3 个答案:

答案 0 :(得分:7)

简单回答:你不能。

system()的目的是阻止何时执行命令。

但你可以欺骗'像这样:

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

此处您不仅可以使用 PID 进程,还可以使用 STDIN STDOUT 。玩得开心!

答案 1 :(得分:1)

不是我自己的专家,但是如果你看一下man page for system

  

system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回

您可以在您执行的命令/脚本中进入后台(并立即返回),但我不认为系统中有针对该案例的具体规定。

我能想到的想法是:

  1. 您的命令可能会通过返回码返回pid。
  2. 您的代码可能希望在活动进程中查找命令的名称(例如,类似于unix的环境中的/ proc API)。
  3. 您可能希望使用fork / exec
  4. 自行启动命令(而不是通过SHELL)

答案 2 :(得分:0)

您可以通过以下代码检查命令的退出状态:

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

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