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++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » C++, 异步
C++11 的标准异步库至少包含下面内容:
相似度: 0.067
编程 » C++, GCC, 编译链接
C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
编程 » C++, 智能指针
前面已经提到std::shared_ptr有三个缺陷:
编程 » C++, 编译链接
最近升级系统,出现好多莫名其妙的问题。其中一个便是 G++编译后,发现其中一个动态链接库引用了绝对地址。正常情况下运行ldd bin/auto应该是下面的结果:
编程 » C++, 编译
一个典型的 GCC C++编译过程为:
编程 » Shell, VBA
某些时候,我们需要在 Excel 中调用命令行或者 Bash 脚本, VBA 可以通过 Shell 函数很方便地做到这一点。以下用ipconfig /all来举例,这条命令行语句用来获得机器的网路配置信息,包括 IP、网关等信息。它可以替换成任何一个 bash 脚本和命令行代码。
由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现folly::MicroSpinLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h