Запустите команду оболочки и получите PID созданный процесс - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть этот код, который запускает команду, которую я ему даю:

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

Проблема, с которой я сталкиваюсь в этом коде, заключается в том, что возвращенный идентификатор процесса относится к процессу оболочки, который выполняет мою команду, которая мешает мнеот проверки, если команда, которую я выполнил, еще работаетКак я могу либо изменить эту функцию, чтобы вместо этого вернуть мне созданный процесс, либо найти PID ребенка из родительского PID?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...