程序调用system()后程序没有执行任何操作

时间:2011-07-01 20:03:21

标签: c unix process

我通过系统(命令)调用调用命令。但是在这个system()调用之后没有执行其他代码。

为什么会这样?我想,system()会为“命令”执行创建一个子进程,我的程序(“command”-child的父进程)将继续执行代码。

我是否正确理解system()?

代码:

printf("before \n");
system("tail -f filename");       /* long lived - never returns */
printf("after \n");

在这里,我没有看到打印后。

3 个答案:

答案 0 :(得分:8)

system(3)函数会使您的进程等待子进程完成。

编辑0:

您必须使用经典的fork(2)execve(2)对来做您想做的事情。您还可以检查C库是否提供POSIX spawn(3)

编辑1:

调查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();
    }