0

我正在我的 Ubuntu PC 上使用 C++ 执行标准 fork/execl 以扫描 Wi-Fi SSID。使用excel调用时,接口名称似乎没有生效。

execl( "/sbin/iwlist", "wlp4s0", "scanning", (char*) NULL );

这成功了,但我在标准错误中得到了这个:

lo 接口不支持扫描。

enp0s25 接口不支持扫描。

看起来 iwlist 正在尝试扫描所有接口。

相反,如果我这样做:

system( "/sbin/iwlist wlp4s0 scanning" );

我没有在标准错误中收到这些消息。

在我的 execl 调用中我做错了什么吗?

4

1 回答 1

0

弄清楚了。

在 bash 你总是写类似

命令 arg1 arg2 ...

当程序“command”解析其参数时,第一个参数(argv[0])是“command”。

但是,当您使用这样的 execl 调用“命令”时:

execl( "/path/to/command", "arg1", "arg2", (char*) NULL );

它得到的第一个参数是'arg1'。如果命令期望这是 argv[1] 而是将其作为 argv[0],这显然不起作用。

这解释了为什么该命令忽略了我的“wlp4s0”ifname。它只是忽略了它期望是命令名称/路径的第一个参数。

所以我原来的问题的解决方案是这样的:

execl( "/sbin/iwlist", "iwlist", "wlp4s0", "scanning", (char*) NULL );
于 2017-06-16T05:48:44.600 回答