使用程序名称查找进程ID
问题描述:
我的程序收到一个字符串(一个shell脚本的路径)作为输入。现在我必须启动该shell脚本并找出它的进程ID。使用程序名称查找进程ID
我使用system()
函数来启动一个shell脚本,然后使用popen()
和ps -aef | grep "ShellScript"
来获得它的PID。
有人建议我有一个更好的方法来做到这一点。如果多个脚本在同一时间运行,我做的方式会给出错误的PID。
启动后给定脚本名称获取PID的正确方法是什么?
答
首先你不应该使用system()
。
更好的方法是使用fork()
,如果您在父进程中则返回PID
> 0,如果您在子进程中则返回return
0。 任何其他返回satus是一个错误,并相应地设置errno
。
当你在孩子的过程,你应该exec
你的命令,而你要么在家长,如果你想避免有一个僵尸进程或处理SIGCHLD
信号一个wait
它。
总是阅读man
以获得更好的洞察力。
下面是一个简单的例子
int pid = -1;
If((pid = fork()) > 0)
{
/* Parent process*/
wait(NULL);
}
else if(pid == 0)
{
/*Child process*/
execv(....);
exit (0);
}
else
{
/*Error*/
perror("fork()");
}
_“如果多个脚本在同一时间运行它会给错误的PID。” _所以你要处理多个PID的? – user0042
也许查找[fork()](https://linux.die.net/man/2/fork)和[exec()](https://linux.die.net/man/3/exec)? – Galik
也许这是用'fork()'和'exec ...()'替换'system()'的最简单的方法。但是:你目前如何实现目标?通常'system()'在脚本完成之前不会返回... –