C++ 中非堵塞地运行系统命令

作者: , 共 503 字 , 共阅读 0

要在C++中运行系统命令,可以直接使用std::system函数:

std::system("make -j");

该函数会等待 make-j 执行完。要想非阻塞,可以用bash&功能,该符号会将任务切换到背后执行,并快速返回,这样C++的程序可以立即往下继续运行:

std::system("make -j &");

上面技巧对大多数命令都够用。但有一种情况,如果我们需要在一条命令行里执行多条命令(一般用;或者&&隔开),这时候&无法很好地实现我们的意图。一种方法是把这些命令包装在同一个命令里(比如使用.sh脚本文件)。还有一种方法是另外起一个线程:

void noblock_system(const std::string& cmd) {
    std::thread thread{[cmd]() {
        std::system(cmd.c_str());
    }};

    thread.detach();
}

还有一种实现方法是使用at,指定程序在多长时间之后执行。

Q. E. D.

类似文章:
编程 » C++
如果我们用std::getline或者简单的std::cin >>获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
编程 » C++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
编程 » Python
在 Python 里,我们可以直接用 os.system 来执行系统命令(假设下面的 strip 是一个可以处理多个文件的第三者程序):
编程 » C++
在实现C++中非阻塞式的用户输入中发现,在没有设置in.sync_with_stdio(false)时,in.rdbuf()里面总是空的。
编程 » C++, 异步
C++11 的标准异步库至少包含下面内容:
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » C++, Python, 并行计算
我们知道, Python 程序有全局锁,任何时候都只有一个 Python 语句在执行。在 Python 中,这通过全局的 GIL 锁来控制。当 C++和 Python 混合编程,且使用多线程时,也必须考虑到 GIL 锁(单线程无需考虑)。
编程 » C++, 智能指针
前面已经提到std::shared_ptr有三个缺陷:
编程 » C++, 编译链接
最近升级系统,出现好多莫名其妙的问题。其中一个便是 G++编译后,发现其中一个动态链接库引用了绝对地址。正常情况下运行ldd bin/auto应该是下面的结果:
2019 年共爬山 10 次,总里程 64 公里,总爬升 2850 米。