C++ 在c+中使用管道和超时执行命令+;(和阅读stdout)

C++ 在c+中使用管道和超时执行命令+;(和阅读stdout),c++,timeout,command,exec,pipe,C++,Timeout,Command,Exec,Pipe,我需要你的帮助 我制作了一个报告deamon(用c++编写),它需要在服务器上定期执行一系列命令 一个简单的示例命令是:“/bin/ps aux |/usr/bin/wc-l” 第一个想法是用popen()派生一个子进程来运行该命令,并在父进程中设置一个alarm(),如果该命令尚未退出,则在5秒后杀死该子进程 我尝试使用“sleep 20000”作为命令,子进程被终止,但sleep命令仍在运行。。。不太好 第二个想法是使用execlp()而不是popen(),它可以使用简单的命令(即没有管道)

我需要你的帮助

我制作了一个报告deamon(用c++编写),它需要在服务器上定期执行一系列命令

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

第一个想法是用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","sleep 20000",NULL); 
只是为了确保,子进程在5秒(我的超时)后被杀死,但sleep命令就停留在那里

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

提前谢谢

TLDR

我需要一种方法:

  • 执行“复杂”命令,如“/bin/ps aux |/usr/bin/wc-l”
  • 得到它的输出
  • 如果超过5秒,请确保将其杀死(ps命令只是一个例子,实际命令可能永远挂起)

使用coreutils的
超时
命令:

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

谢谢我现在不能测试,但我回家后会试试的!不过,有一件事是,用我的解决方案杀死子进程也杀死了“sh-c”,但不知何故,“sleep 20000”进程成功地保留了下来。在推荐
timeout
之前,我对它进行了测试,并确保
sleep
也被终止。
execlp(“timeout”、“timeout”、“5”、“sh”、“sh”、“c”、“ls-lisa | grep等”,NULL)有效,谢谢!
/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"