假设我运行了一个简单的后台进程,它是:
sleep 25 &
我在命令行上执行它:
> sleep 25 &
[1] 26390
> ps
PID TTY TIME CMD
26390 pts/52 0:00 sleep
6746 pts/52 0:02 tcsh
26391 pts/52 0:00 ps
>
可以看到 sleep 正在后台执行,pid 26390
现在我尝试使用 C++ 做同样的事情。顺便说一下,有许多不同的系统调用可以做到这一点。
using system
using fork
using pipe
我试过下面的代码:
if(p=fork()){
//Main process
cout<<p<<endl;
}
else{
execv("sleep 20 &",(char **)NULL);
}
}
输出是:
> ./a.out
27391
> ps
PID TTY TIME CMD
6746 pts/52 0:02 tcsh
27392 pts/52 0:00 ps
>
可以看到后台没有sleep运行。 现在我尝试了另一种方式:
FILE* pipe = popen("sleep 20 &", "r");
if(pipe){
char buffer[128];
while(fgets(buffer, 128, pipe));
cout<<buffer<<endl;
pclose(pipe);
}
这会挂起 20 秒,我永远不会得到带有进程 ID 的 cout。
> ./a.out
>
我又尝试了另一种方式:
if(p=fork()){
//Main process
cout<<p<<endl;
}
else{
system("sleep 20 &");
}
}
> ./a.out
27464
> ps
PID TTY TIME CMD
27466 pts/52 0:00 sleep
27467 pts/52 0:00 ps
6746 pts/52 0:02 tcsh
现在您可以看到 sleep 在后台运行,但 PID 不同。
但我需要的是在后台执行的 sleep 命令的实际 pid。 我坚信应该有某种方法可以获取在 c++ 后台运行的进程的确切 pid。有人可以帮忙吗?
最佳答案
您正在打印的进程 ID 是正确的。问题是您的 sleep 没有正常开始。
sleep 的参数中不需要“&”;您的代码已经在这样做了。如果您确实有“&”, sleep 可能会报错,因为“&”不是持续时间。
试试这样的 exec 调用:
execlp("sleep", "sleep", "20", 0);
这会在 PATH 中的目录中搜索名为“sleep”的文件,并将当前进程替换为使用参数“sleep”和“20”调用的进程。这些参数使用 argv 和 argc 传递给 main()。
阅读 exec 的手册页以获取更多详细信息。
关于c++ - 使用 C++ 获取在后台执行的命令的实际进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20138838/