Ho bisogno di creare un'applicazione linux che faccia la scansione della rete wireless, metti il risultato in una struttura e lo invii in qualche modo a un'altra applicazione principale che userà i dati. La mia idea iniziale era di creare una pipe nell'applicazione principale, fork e avviare un altro processo da execl, che può scrivere sulla pipe. Qualcosa di simile a questo:Come scambiare dati binari tra processi in 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
}
Questo però non funziona con dati binari, se binarie 0 appare nell'output. Così ho potuto sia formattare l'output dell'applicazione wifiscan in testo, inviarlo a pipe e analizzare nell'applicazione principale, o farlo in modo più intelligente che non conosco ancora.
Quali sono altri modi per scambiare dati in modo affidabile tra processi in Linux?
'ftell()' è improbabile che lavorare sui flussi unseekable come i tubi, in ogni caso. – caf
Sono d'accordo con la costruzione di un protocollo di base per i dati e quindi utilizzando 'fread()' invece di 'fgets()'. Questo [risposta] (http://stackoverflow.com/questions/2870549/fifos-implementation/2871538#2871538) ad una domanda sul [implementazione FIFO] (http://stackoverflow.com/q/2870549/203667) potrebbe essere di ulteriore utilizzo in quanto fornisce un paio di esempi su come un tale protocollo potrebbe essere eseguito. – jschmier
fread() funziona perfettamente. Grazie – Patryk