Necesito crear una aplicación de Linux que realice el escaneo de red inalámbrica, coloque el resultado en una estructura y envíela de alguna manera a otra aplicación principal que usará los datos. Mi idea inicial era crear una tubería en la aplicación principal, fork y comenzar otro proceso por execl, que puede escribir en la tubería. Algo como esto:Cómo intercambiar datos binarios entre procesos en Linux
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
}
Sin embargo, esto no funcionará con datos binarios, si el 0 binario aparece en la salida. Así que podría formatear la salida de la aplicación wifiscan en texto, enviarla a canalizar y analizar en la aplicación principal, o hacerlo de forma más inteligente que aún no sé.
¿Cuáles son otros medios para intercambiar datos de manera confiable entre procesos en Linux?
'ftell()' no es probable que funcione en flujos desechables como tuberías, de todos modos. – caf
Estoy de acuerdo con la construcción de un protocolo básico para sus datos y luego usando 'fread()' en lugar de 'fgets()'. Esta [respuesta] (http://stackoverflow.com/questions/2870549/fifos-implementation/2871538#2871538) a una pregunta sobre [Implementación FIFOs] (http://stackoverflow.com/q/2870549/203667) puede ser de uso adicional ya que proporciona un par de ejemplos sobre cómo se podría implementar dicho protocolo. – jschmier
fread() funciona perfecto. Gracias – Patryk