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