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

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

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

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

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

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

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

3 ответа

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

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

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

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

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

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

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

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

Другие вопросы по тегам