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