1. 事发原因
我在一个大的轮询中,会检查WIFI的物理链路层是否连接成功,如果连接成功并且当前网络设置成dhcp的情况下,我会执行dhclient wlan0 -r && dhclient wlan0 &
来获取IP地址。
在上面的命令中,wlan0是WIFI的接口名称,上面的命令是由如下两条命令组成:
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没有阻塞等待。