运行shell命令并获取PID创建的过程

时间:2019-02-01 07:25:56

标签: c++ linux process

我有这段代码可以运行我给它的命令:

pid_t Utils::RunCommand(std::string cmd, int * infp, int * outfp)
{
std::cout << cmd << std::endl;
const char* command = cmd.c_str();
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; }

此代码存在的问题是返回的进程ID是运行我的命令的shell进程的代码,这使我无法检查我运行的命令是否仍在运行。我该如何修改此函数以取而代之地将创建的过程返回给我,或者如何从父PID中找到子PID?

0 个答案:

没有答案