【问题标题】:program not executing anything after a call to system()调用 system() 后程序不执行任何操作
【发布时间】:2011-09-27 00:27:19
【问题描述】:

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

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

我没有正确理解 system() 吗?

代码:

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

在这里,我打印后看不到。

【问题讨论】:

    标签: c unix process


    【解决方案1】:

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

    编辑 0:

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

    编辑 1:

    查看waitpid(2) 以保留父级。

    【讨论】:

    • 非常感谢,有没有一个函数可以让我创建孩子,让它执行并继续父执行?
    • 最简单的方法是system("tail -f filename&")
    • @William:谢谢 :),但现在我看到了有趣的行为:在运行我的 prog 时输入“&”之前,我可以在“ps”输出中看到我的 prog 名称。现在,使用“&”,我在“ps”中看不到它。为什么会这样?
    • @hari 可能是因为程序现在正在运行完成,而当你运行 ps 时它已经完成
    • @Nikolai:刚刚意识到 :D,愚蠢的我。我可以让它继续运行并且只有在孩子结束后才结束吗?
    【解决方案2】:

    你必须 fork(2) 才能继续执行代码。

    【讨论】:

    • 是的,我刚刚发现我的错误。
    【解决方案3】:

    有点晚了,但这里有一个解决方案(已在 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多