使用popen和system执行使用“&“符号的后台命令的差异

14 篇文章 0 订阅

1. 事发原因

我在一个大的轮询中,会检查WIFI的物理链路层是否连接成功,如果连接成功并且当前网络设置成dhcp的情况下,我会执行dhclient wlan0 -r && dhclient wlan0 &来获取IP地址。
在上面的命令中,wlan0WIFI的接口名称,上面的命令是由如下两条命令组成:

dhclient wlan0 -r	# --- 1
dhclient wlan0 &	# --- 2

其中,1是如果这个网口已经开启dhclient服务,则杀掉其进程,如果没有开启,则会报一个信息,没有其他影响。2是为了再次执行dhclient服务,因为在执行的时候会去申请IP等信息,这个可能很快返回,也可能会需要较长的时间等待,因此加上&是希望其能够里面返回执行后面的操作,将dhclient服务放到后台执行,不在阻塞等待其返回结果。

2. 执行方法

总共找到两种执行的方法,分别是使用popen和system。
C++对应的代码如下:

#include <array>

int execCmd1(const std::string &command, std::string &output)
{
    output.clear();
    std::array<char, 128> buffer{};
    FILE *pipe = popen(command.c_str(), "r");
    if(!pipe)
    {
        return -1;
    }

    while (fgets(buffer.data(), buffer.size(), pipe) != nullptr)
    {
        output += buffer.data();
    }
}

int execCmd2(const std::string &command)
{
    return system(command.c_str());
}

对于使用popen能够方便获取到执行命令的输出结果。

    const std::string DHCP_CMD = "dhclient wlan0 -r && dhclient wlan0 &";
    
    std::string output;
    execCmd1(DHCP_CMD, output); // popen
    execCmd2(DHCP_CMD);             // system

3. 执行结果

使用popen执行会阻塞等待dhclient结果,使用system没有阻塞等待。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值