我通过系统(命令)调用调用命令。但是在这个system()调用之后没有执行其他代码。
为什么会这样?我想,system()会为“命令”执行创建一个子进程,我的程序(“command”-child的父进程)将继续执行代码。
我是否正确理解system()?
代码:
printf("before \n");
system("tail -f filename"); /* long lived - never returns */
printf("after \n");
在这里,我没有看到打印后。
答案 0 :(得分:8)
system(3)
函数会使您的进程等待子进程完成。
您必须使用经典的fork(2)
和execve(2)
对来做您想做的事情。您还可以检查C库是否提供POSIX spawn(3)
。
调查waitpid(2)
以保持父母身边。
答案 1 :(得分:0)
你必须fork(2)继续执行代码。
答案 2 :(得分:0)
有点晚了,但这里有一个解决方案(在 Linux 上测试并运行):
#include <sstream>
#include <cstdlib> //for system()-calls
#include <thread>
//just a utility-function..
template<typename...P> std::string says(P...p)
{
std::string r{};
std::stringstream ss("");
(ss<<...<<p);
r=ss.str();
return r;
}
#if defined(YOUR_COMPILERS_LINUX_DETECTION_FLAG)
template<typename...T> void _S_R_A_(const std::string &sc)
{
std::string s{};
s=says("nohup ", sc, " 1&2>/dev/null &"); //like old Windows TSR-call
std::system(s.c_str());
}
#else // if defined(YOUR_COMPILERS_WINDOWS_DETECTION_FLAG)
template<typename...T> void _S_R_A_(const std::string &sc) //assuming windows - NOT TESTED!
{
std::string s{};
s=says("start ", sc);
std::system(s.c_str());
}
#endif
template<typename...T> void SysRunApp(const std::string &sApp, T...t)
{
std::string sa{};
sa=says(sa, sApp, " ", t...); //caller must ensure parameters are
//correctly spaced/escaped etc
std::thread(_S_R_A_, sa).detach();
}