2012-06-12 16 views
6

Non sono sicuro di come gestire le attività asincrone in un programma che sto scrivendo e spero che qualcuno più esperto possa almeno indirizzarmi nella giusta direzione.Elaborazione parallela in linux

Sto eseguendo Angstrom Linux su un processore ARM incorporato. Il mio programma controlla diversi servi tramite PWM hardware esposto e una telecamera su PTP. Inoltre è il daemon socket che accetta i comandi da un client arbitrario (Android in questo caso). Il PTP della fotocamera è lento e non voglio aspettare che finisca il suo compito perché il resto del programma deve essere reattivo.

Ho provato i thread, ma eventuali problemi nel thread della fotocamera sembrano uccidere l'intero processo. Idealmente, voglio mandare la fotocamera da sola a fare le sue cose e quando è finita, sappia che la funzione principale lo sa. Si tratta di una tecnica di forking appropriata o ho implementato il threading in modo errato?

Inoltre, mi piacerebbe stare lontano dalle librerie secondarie di grandi dimensioni per evitare ulteriori problemi di compilazione incrociata, che ho già avuto. Grazie in anticipo per eventuali suggerimenti.

+2

Perché non lo si esegue in un nuovo processo? Quindi comunicare tramite prese? – Hassan

+0

Stavo usando la Programmazione Linux avanzata come mia guida ... non copre la funzione clone(). Sembra che la tecnica appropriata sia –

+0

. Oppure potrebbe essere ['system()'] (http://www.cplusplus.com/reference/clibrary/cstdlib/system/). Dai un'occhiata anche a quello. – Hassan

risposta

1

Prendere il metodo di base della risposta di steveha ma saltare i tubi init (8) e named.

fork() un bambino contenente il codice della telecamera e comunicare tramite pipe normali o socket di dominio. Codice un gestore di segnale per SIGCHLD nel genitore.Se il bambino muore interrogare i motivi per cui con il codice di ritorno da wait(). Se è morto da solo, pulirlo e riavviarlo; se termina normalmente, fa ciò che è appropriato in quel caso. Comunicare con il bambino attraverso qualsiasi IPC si finisce per scegliere. Questo ti dà un maggiore controllo sul bambino rispetto a init e socket o pipe di dominio, in particolare, renderà più semplice la configurazione e la comunicazione tra genitore e figlio piuttosto che scherzare con la funky semantica dei FIFO.

Ovviamente, se ci sono davvero problemi con il codice della telecamera, tutto ciò che si è veramente fatto è rendere gli errori un po 'più gestibili non eliminando l'intero programma. Idealmente dovresti ottenere il codice della telecamera per funzionare in modo impeccabile se questo è in tuo potere.

+0

Il codice della telecamera funziona ... la mia scelta di parole era scadente. Ad esempio, se non è collegata alcuna videocamera, il thread della telecamera ritorna e, per qualsiasi ragione, introduce un errore di segmentazione nel programma. Qual è la tua opinione sulla funzione clone()? –

+0

Clone non ha intenzione di fare nulla per te. Sia i fili che la forcella sono solo involucri intorno al clone. Se hai problemi con loro, abbassare un livello inferiore non risolverà il tuo problema. Forse dovresti pubblicare le basi del tuo codice thread in un'altra domanda. Potresti fare un errore molto semplice. – Duck

+0

Grazie a tutti per il loro aiuto. Ho usato una forchetta con un tubo semplice e le cose stanno funzionando come speravo. Mi piace l'idea del gestore del segnale per scoprire lo stato del processo figlio. –

3

Il tuo problema sembra un caso classico per più processi, che comunica con una sorta di comunicazione tra processi (IPC).

La fotocamera deve disporre di un proprio processo e, se il processo si interrompe, il processo principale non dovrebbe presentare problemi. Si potrebbe anche avere il processo init(8) per gestire il processo della fotocamera; che può riavviare automaticamente il processo se muore per qualsiasi motivo.

È possibile impostare una pipe denominata in modo permanente, quindi il processo della fotocamera potrebbe riaprirlo in qualsiasi momento dopo il riavvio.

Ecco alcune documentazione su named pipe:

http://www.tldp.org/LDP/lpg/node15.html

ho trovato questo dalla pagina di Wikipedia:

http://en.wikipedia.org/wiki/Named_pipe

ho cercato StackOverflow e ho trovato una discussione di named pipe vs. prese:

IPC performance: Named Pipe vs Socket

+0

Quel documento UNIX e Windows è terribilmente disinformato sui tubi unix. 'popen' non è una chiamata di sistema, le pipe non sono in alcun modo garantite per essere a 2 vie (i pipe di linux non lo sono) e' mknod' è per file speciali, non solo pipe come sostiene in modo fuorviante questo documento. – Dave

+0

Wow, mostra i pericoli di una rapida ricerca su Google e sfoglia velocemente un documento. Mi scuso con tutti per aver postato un link non valido. Lo modificherò dalla mia risposta adesso. – steveha

+0

Grazie per il vostro aiuto –

0

Ho provato i thread, ma eventuali problemi nel thread della fotocamera sembrano uccidere l'intero processo.

Quando dici uccidere l'intero processo, cosa succede realmente?

Ti ho detto che è meglio eseguire il debug del problema precedente, piuttosto che provare a racchiudere il bug in un processo biforcuto. Preferiresti avere un sistema affidabile che includa una fotocamera affidabile, piuttosto che un sistema centrale affidabile con una videocamera inaffidabile.

+0

un ritorno 0; introduce un errore di segmentazione –

+0

@CountZero: E cosa dice gdb nello stack in quel momento? Quale linea di codice provoca l'errore seg? –