Как я могу получить processID, созданный popen?

Я должен выполнить команду и вернуть результат как cmd.

Я только что нашел единственный метод для этого требования. Я использовал функцию popen для выполнения команды и возврата результата, а затем использовал функцию pclose () для закрытия потока и обработки.

Но если команды никогда не заканчиваются, например, «ping 8.8.8.8 –t», я не могу закрыть процесс с помощью функции pclose ().

Если я уничтожу дочерний процесс, созданный popen () диспетчером задач, функция pclose работает нормально.

Как я могу получить processID, созданный popen для уничтожения?

===================
А также :
Если я использую _popen () в Windows, что мне нужно сделать, чтобы получить PID?

0

Решение

Оберните поп-функцию самостоятельно с помощью ‘pipe + fork + dup2 + exec (‘ / bin / bash ‘,’ -c ‘, yourCommandHere)’

1

Другие решения

popen () пишется с использованием execve () или другой функции exec.

Что вы делаете: (1) создаете пару каналов с … pipe (), которые дают вам два файловых дескриптора. Один для стандартного ввода, а другой для стандартного вывода. Затем вы выполняете fork () и выполняете execve () в дочернем процессе. Когда вы вызываете fork (), вы получаете дочерний процесс.

Файл, возвращаемый popen (), является FILE *, чтобы получить его из pipe (), вы должны выполнить fdopen (). Не слишком сложно.

Это довольно много работы, но если вам нужен идентификатор …

Теперь … под MS-Windows это немного отличается, вы хотите использовать CreatePipe () и CreateProcess () или аналогичные функции. Но результат похож.

0

Использовать

   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 для получения всей информации о дочерних процессах.

0
По вопросам рекламы [email protected]