2017-09-14 62 views
-1

我的程序收到一个字符串(一个shell脚本的路径)作为输入。现在我必须启动该shell脚本并找出它的进程ID。使用程序名称查找进程ID

我使用system()函数来启动一个shell脚本,然后使用popen()ps -aef | grep "ShellScript"来获得它的PID。

有人建议我有一个更好的方法来做到这一点。如果多个脚本在同一时间运行,我做的方式会给出错误的PID。

启动后给定脚本名称获取PID的正确方法是什么?

+2

_“如果多个脚本在同一时间运行它会给错误的PID。” _所以你要处理多个PID的? – user0042

+1

也许查找[fork()](https://linux.die.net/man/2/fork)和[exec()](https://linux.die.net/man/3/exec)? – Galik

+1

也许这是用'fork()'和'exec ...()'替换'system()'的最简单的方法。但是:你目前如何实现目标?通常'system()'在脚本完成之前不会返回... –

回答

0

首先你不应该使用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()"); 
}