我必须执行命令并返回结果,如cmd。
我刚刚找到了这个要求的唯一方法。我使用popen函数执行命令并返回结果,然后使用pclose()函数关闭流和进程。
但是如果命令永远不会结束,例如“ping 8.8.8.8 -t”,我就无法通过使用pclose()函数来关闭进程。
如果我通过任务管理器杀死popen()创建的子进程,则pclose函数可以正常工作。
如何获取popen创建的processID来杀死?
===================
并且:
如果我在windows中使用_popen(),我需要做些什么才能获得PID?
答案 0 :(得分:1)
使用'pipe + fork + dup2 + exec('/ bin / bash',' - c',yourCommandHere)'自己包装一个popen函数
答案 1 :(得分:0)
popen()是使用execve()或其他一些exec函数编写的。
你要做的是(1)用... pipe()创建一对管道,它给你两个文件描述符。一个是stdin,另一个是stdout。然后你fork()并在子进程中执行execve()。在您调用fork()时,您将获得子进程。
popen()返回的文件是一个FILE *,要从pipe()获取它,你必须做一个fdopen()。不太难。
这是相当多的工作,但如果你需要标识符......
现在......在MS-Windows下,这有点不同,你想使用CreatePipe()和CreateProcess()或类似的功能。但结果是相似的。
答案 2 :(得分: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使用管道和fork与execl来处理popen()函数。因此,您可以使用ps with aux来获取所有子进程信息。