据我所知, system()
调用在内部使用fork()
和exec()
但封装它们以便于处理。
是否有可能从用system()
调用创build的subprocess获取PID?
目标:我希望在某个超时之后能够SIGINT任何subprocess。 我可以使用fork()
和exec()
重buildsystem()
函数。 但是我需要的只是孩子的PID,也许有使用system()
快捷方式?
通常, system()
是一个同步操作。 这意味着它不会返回,直到孩子退出,即system()
返回时子进程没有有效的PID,因为子进程不再存在。
在使用system()
时候没有办法(我知道的system()
。 另外,使用system()
还有一个额外的步骤来启动一个shell来执行你的命令,这样做有点难度。 你可能更好用fork()
和exec()
替换它。
但是,有一种方法可以通过/ proc文件系统来做你想做的事情。 您可以通过进程目录(目录名称是PID)并检查“状态”文件。 他们每个人都有一个PPID条目指定父pid。
这样,如果你得到一个“状态”文件,它指定你的进程的PID为PPID,那么它在/ proc文件系统中的文件夹名就是你正在查找的值。
我有这个问题。 解决它:
int syspid,status; pid_t ppid=getpid(); syspid=ppid+1 status=system(argv[1]); //here argv1 was another program;
这可能并不总是有效,但是大多数情况下,system()的PID是父节点的pid +1(除非有多个分支)。