gpt4 book ai didi

c++ - 在 C++ 中使用管道和超时执行命令(并读取标准输出)

转载 作者:太空狗 更新时间:2023-10-29 20:43:53 25 4
gpt4 key购买 nike

我需要你的帮助!

我制作了一个报告守护进程(用 C++ 编写),它需要定期在服务器上执行一堆命令。

一个简单的示例命令是:“/bin/ps aux |/usr/bin/wc -l”

第一个想法是 fork 一个子进程,该子进程使用 popen() 运行命令,并在父进程中设置一个 alarm() 以在命令尚未退出的情况下在 5 秒后杀死子进程。

我尝试使用“sleep 20000”作为命令,子进程被杀死但 sleep 命令仍在运行......不好。

第二个想法是使用 execlp() 而不是 popen(),它适用于简单的命令(即没有管道),例如“ls -lisa”或“sleep 20000”。我可以获得结果,如果 5 秒后没有完成,进程将被终止。

现在我需要执行“/bin/ps aux |/usr/bin/wc -l”命令,显然它不能直接与 execlp() 一起使用,所以我尝试了“hack”:

execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);

我工作...或者我想...我试过

execlp("sh","sh","-c","sleep 20000",NULL); 

只是为了确定,子进程在 5 秒后(我的超时)被杀死,但 sleep 命令只是停留在那里......

我愿意接受建议(我愿意接受黑客攻击)!

提前致谢!

TLDR;

我需要一种方法:

  • 执行“复杂”命令,例如“/bin/ps aux |/usr/bin/wc -l”
  • 得到它的输出
  • 确保它在超过 5 秒时被杀死(ps 命令只是示例,实际命令可能会永远挂起)

最佳答案

使用来自 coreutils 的 timeout 命令:

/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"

关于c++ - 在 C++ 中使用管道和超时执行命令(并读取标准输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14193641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com