添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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没有阻塞等待。

【摘要】执行带有"&"的需要后台执行的命令,使用`popen`会等待执行结果后返回,`system`能够达到非阻塞的效果。示例中包含了具体使用`popen`和`system`函数的具体写法。
文章目录一、python OS命令注入漏洞1. 警惕subprocess.getstatusoutput OS命令注入漏洞2. os.popen OS命令注入漏洞os.popen基础python os.popen OS命令注入漏洞 一、python OS命令注入漏洞 1. 警惕subprocess.getstatusoutput OS命令注入漏洞 python直接执行代码漏洞_警惕OS命令注入漏洞 - python篇 参考URL: https://blog.csdn.net/weixin_3980585
最近需要大量的数据分析,但是需要执行一个GCC名令对所有文件生成中间文件,但是Makefile不会写,所以就只能直接调用Linux终端的命令了,所以使用到了popen()函数,但是执行的时候,每次都会执行一部分然后显示出错,什么原因?google后才发现这个函数的功能是fork子进程,但是每次我的没有close掉,估计子进程太多就炸掉了,加上之后完美运行。 简单说一下popen()函数
引用度娘说的: popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。 这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。 也就是,popen创建管道,执行shell命令将文件流中的某些数据读出
subprocess.Popen(arg, shell=True,cwd='path') arg是你执行命令,可以是字符串,也可以是列表/元组,如果 args 是字符串,它将作为命令行字符串通过shell 执行,(前提:sell=True) cwd 不是None ,在子程序执行前,当前的工作目录将变为cwd(运行命令的路径) 未完 待续,
`popen` 和 `system` 是两个不同的 C 库函数,它们都用于在程序中执行外部命令。 不同之处在于,`popen` 可以让您通过标准输入/输出与被执行命令进行通信,而 `system` 只能用于执行命令并等待其完成。 因此,如果您需要在程序中执行外部命令并获取其输出,则应使用 `popen`;如果您只需要执行外部命令,则应使用 `system`。