获取系统api调用执行的命令的pid

时间:2014-04-29 12:21:46

标签: c linux posix

我在linux中使用system api来实现shell命令操作。有时在执行命令时,系统调用会被阻止并且永远不会返回。因此,如果我知道执行的命令的进程ID,我将终止该进程并再次调用系统api。

例如:

system("ftpget -u<> -p<> ip remote-file local-file");

有时ftpget块,系统调用永远不会返回。所以我不希望无限期地阻止系统调用。除了杀死ftpget进程之外还有其他解决方案吗? 如果没有,那么我如何获得ftpget的进程ID?

2 个答案:

答案 0 :(得分:0)

如果您没有运行并发的ftpget实例,那么您可能会放弃使用system() killall获取pid,并按名称终止该进程。

system("killall ftpget");

你应该考虑使用execv()之类的东西,但是如果你真的需要杀死一个孤立的实例。

答案 1 :(得分:0)

不幸的是system()没有提供告诉调用者子进程的pid的机制。您可以使用fork() / exec()直接启动子进程并保留pid供您自己使用。

请注意,这样启动的进程可能会自行生成子进程,这将再次出现您不知道的pids。

示例(未经测试):

#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // child
        execlp("ftpget", "ftpget", "-u<>", "-p<>", "ip",
               "remote-file", "local-file", (char*)NULL);
        exit(-1); // this will only ever happen when exec fails
    }
    else if (pid > 0) {
        // parent
        std::cout << "pid of child process is " << pid << "\n";
        waitpid(pid, 0, 0);
    }
    else {
        // error
    }
}

供参考: