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

作者: , 共 506 字 , 共阅读 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.

类似文章:
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
编程 » C++, 异步
C++11 的标准异步库至少包含下面内容:
编程 » C++, 智能指针
前面已经提到std::shared_ptr有三个缺陷:
编程 » Shell, VBA
某些时候,我们需要在 Excel 中调用命令行或者 Bash 脚本, VBA 可以通过 Shell 函数很方便地做到这一点。以下用ipconfig /all来举例,这条命令行语句用来获得机器的网路配置信息,包括 IP、网关等信息。它可以替换成任何一个 bash 脚本和命令行代码。
相似度: 0.061
boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0
编程 » C++,
C++的多行宏有标准定义方式,boostfolly库都采用了这种方式:
编程 » Matlab
Matlab 在启动时会自动运行脚本startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
相似度: 0.056
编程 » C++
C++的浮点数转整数有四种方法,直接类型转换、round、floor、ceil。其效果如下表:
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » C++, folly
高效程序总是尽量避免频繁触碰在堆上分配和释放内存,所以无论是std::string还是folly:fbstring都做了SSO( small string optimization )。而folly::FixedString是一个很有意思的实现,它可以把任意长度的字符串都放在堆上。代码可见https://github.com/facebook/folly/blob/master/folly/FixedString.h
由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现folly::MicroSpinLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h