c++ - 使用 C++ 获取在后台执行的命令的实际进程 ID

标签 c++ c process solaris

假设我运行了一个简单的后台进程,它是:

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/

相关文章:

无法将 C 中的位域初始化为全局

c# - 如何重新使用现有/已经打开的 Windows 资源管理器窗口来启动资源管理器

c++ - 迪尔德 : Symbol not found: _PyBaseObject_Type

c++ - 依赖树算法

c++ - 如何最正确地使用 libusb 与连接的 USB 设备通信?

c - Ascii 字符编码问题

在 C 中将十六进制转换为 float

Java进程永不停止

c# - 使用 String args[] 在 C# 中调用进程

c++ - 模板化的 Barton 和 Nackman 技巧问题