我需要创建一个Linux应用程序,它可以进行无线网络扫描,将结果放入结构体中,并以某种方式发送给另一个主要应用程序,该应用程序将使用数据。 我的初始想法是在主要应用程序中创建一个管道,通过execl分叉并启动另一个进程,该进程可以写入管道。类似于这样:
pid_t pid = NULL;
int pipefd[2];
FILE* output;
char line[256];
pipe(pipefd);
pid = fork();
if (pid == 0)
{
// Child
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
execl("/sbin/wifiscan", "/sbin/wifiscan", (char*) NULL);
}
//Only parent gets here. Listen to what the wifi scan says
close(pipefd[1]);
output = fdopen(pipefd[0], "r");
while(fgets(line, sizeof(line), output))
{
//Here we can listen to what wifiscan sends to its standard output
}
然而,如果二进制0出现在输出中,则此方法无法处理二进制数据。因此,我可以将wifiscan应用程序的输出格式化为文本,将其发送到管道中并在主应用程序中解析,或者以我目前不知道的更智能的方式完成。
在Linux中,有哪些其他可靠交换进程数据的方式?
ftell()
在像管道这样的不可寻址流上可能无法正常工作。 - caffread()
而不是fgets()
。这个答案针对FIFOs实现的问题可能会有额外的用处,因为它提供了一些关于如何构建这样一个协议的例子。 - jschmier