对于我正在进行的项目,我必须定期向所选SSID发送探测请求(每10 ms约10次)。
目前我正在使用以下代码执行此操作:
char *args[] = {"iwlist", INTERFACE, "scan", "essid", ssid, (char *) NULL};
runQuietlyNonblocking(args);
其中runQuietlyNonblocking
使用execvp和fork在args中运行命令,而不等待新线程完成。
但是由于iwlist扫描等待探测器答案,这需要比创建新探测请求所需的时间更多,探测请求会被发送但是大约半小时后我得到了大约10000个线程,程序因内存不足而崩溃。
我正在使用raspbian lite安装的raspberry pi。 有没有更好的方法来发送探测请求而无需等待答案?我可以手动发送探测请求还是告诉iwlist不要查找响应?
答案 0 :(得分:0)
有几个选择。据我所知popen()与" w"参数不等待命令执行,虽然它会分叉进程并且pclose()将等待命令执行。 system()只是等待命令执行,但你可能会尝试将它提供给shell,就像这样
system("iwlist wlan0 scan &")
也就是说,如果你遇到了iwlist。 作为替代方案,您可以尝试使用wpa_supplicant。它有"扫描"接口和" scan_results",第一个发送请求,而后者发出结果。
for (;;)
{
FILE *fp = popen ("wpa_cli -i wlan0 scan", "w");
if (fp)
pclose (fp);
sleep (1);
}
(暗示wpa_supplicant启动并运行)。
最后但并非最不重要的是,有些驱动程序允许使用自己的界面进行后台扫描,已经在专有的Redpine驱动程序上看到过。