Я должен выполнить команду и вернуть результат как cmd.
Я только что нашел единственный метод для этого требования. Я использовал функцию popen для выполнения команды и возврата результата, а затем использовал функцию pclose () для закрытия потока и обработки.
Но если команды никогда не заканчиваются, например, «ping 8.8.8.8 –t», я не могу закрыть процесс с помощью функции pclose ().
Если я уничтожу дочерний процесс, созданный popen () диспетчером задач, функция pclose работает нормально.
Как я могу получить processID, созданный popen для уничтожения?
===================
А также :
Если я использую _popen () в Windows, что мне нужно сделать, чтобы получить PID?
Оберните поп-функцию самостоятельно с помощью ‘pipe + fork + dup2 + exec (‘ / bin / bash ‘,’ -c ‘, yourCommandHere)’
popen () пишется с использованием execve () или другой функции exec.
Что вы делаете: (1) создаете пару каналов с … pipe (), которые дают вам два файловых дескриптора. Один для стандартного ввода, а другой для стандартного вывода. Затем вы выполняете fork () и выполняете execve () в дочернем процессе. Когда вы вызываете fork (), вы получаете дочерний процесс.
Файл, возвращаемый popen (), является FILE *, чтобы получить его из pipe (), вы должны выполнить fdopen (). Не слишком сложно.
Это довольно много работы, но если вам нужен идентификатор …
Теперь … под MS-Windows это немного отличается, вы хотите использовать CreatePipe () и CreateProcess () или аналогичные функции. Но результат похож.
Использовать
ps -o user,pid,ppid,command -ax | grep <process name>
чтобы получить всю информацию о дочернем процессе. На самом деле popen () выполняет pipe () для выполнения команды. См. Справочную страницу для POPEN ()
На странице руководства
The environment of the executed command will be as if a
child process were created within the popen() call using
fork(2). If the application is standard-conforming (see
standards(5)), the child is invoked with the call:
execl("/usr/xpg4/bin/sh", "sh", "-c",command, (char *)0);
otherwise, the child is invoked with the call:
execl("/usr/bin/sh", "sh", "-c",command, (char *)0);
The pclose() function closes a stream opened by popen() by
closing the pipe. It waits for the associated process to
terminate and returns the termination status of the process
running the command language interpreter. This is the value
returned by waitpid(3C).
Это ясно показывает, что popen использует pipe и fork с execl для обработки функции popen (). Таким образом, вы можете использовать ps с aux для получения всей информации о дочерних процессах.