我需要创建一个可以进行无线网络扫描的linux应用程序,将结果放入一个结构中并以某种方式将其发送到另一个将使用该数据的主应用程序.我最初的想法是在主应用程序中创建一个管道,fork并通过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
}
Run Code Online (Sandbox Code Playgroud)
但是,如果输出中出现二进制0,则无法使用二进制数据.所以我可以将wifiscan应用程序的输出格式化为文本,将其发送到管道并在主应用程序中解析,或者以我还不知道的更智能的方式进行.
在Linux中的进程之间可靠地交换数据的其他方法是什么?
我在质疑嵌入式软件工程师的候选人(在我们公司,我们主要使用C,有时候是C++).我经常给候选人一点麻烦的问题.我没有提到,当它不明显时,它可以通过一点点琐事来解决.我也接受解决方案而不使用位操作,但随后我将候选引导到位(例如,通过说:"如果你不能使用模运算符怎么办").示例问题可能是:
在我看来,任何体面的软件工程师(甚至是新毕业生)都应该在一分钟之内轻松解决这些问题,无论他在哪个软件领域工作.然而,我的老板最近抱怨这些问题对于那些在GUI中工作的人来说太低级了.情况来看,我的提问毫无用处,因为我的老板聘请了一位在这个话题上完全失败的候选人,但他声称自己在Qt方面经验丰富(我无法检查这一点,因为我从未使用过Qt,而且有些原因我是唯一可以在此刻采访他的人.
所以我的问题是:对于任何(嵌入式)软件工程师来说,这是一个很好的问题,或者我的老板是对的,我应该放弃向所有候选人提问?
我有一个类包装了大量的网络数据包字节。该类实现一个队列并提供(除其他外)front()函数,该函数返回构成队列中最旧数据包的字节常量向量。
class Buffer{
unsigned char data[65536];
unsigned int offset;
unsigned int length;
[...]//other fields for maintaining write ptr etc.
public:
const std::vector<unsigned char> front(){
return std::vector<unsigned char>(data + offset, data + offset + length);
}
//other methods for accessing the queue like
//pop(), push(), clean() and so forth...
[...]
}
Run Code Online (Sandbox Code Playgroud)
上述front()函数实现的性能受到从当前数据包占据的范围内不必要的复制字节的影响。由于向量是常量,因此无需复制数据。我想要的是在已经存储在缓冲区中的数据上创建一个向量。当然,向量的析构函数不应该释放内存。