Domanda

Sto lavorando su un programma multi-processo che fondamentalmente eseguire fuzzificazione su ogni strato di un file RVB. (1 processo -> 1 livello). Ogni processo figlio sta fornendo un file temporaneo utilizzando la funzione: tmpfile(). Dopo ogni processo figlio termina il suo lavoro, il processo principale deve leggere ogni file temporaneo creato e assemblare i dati. Il problema è che non so come leggere ogni file temporaneo all'interno del processo principale dal momento che non riesco ad accedere alla memoria di processo del bambino, quindi non posso sapere qual è il puntatore temporaneo per il file temporaneo creato!

Qualche idea?

Non esitate a chiedere chiarimenti, se necessario.

È stato utile?

Soluzione

Se si chiama tmpfile() nel processo padre, figlio erediterà tutti i descrittori aperti e sarà in grado di scrivere il file e file aperto sarà accessibile per i genitori pure.

Altri suggerimenti

La funzione tmpfile() si restituisce un puntatore FILE a un file senza nome determinato - anzi, anche il processo figlio non può facilmente determinare un nome per il file, per non parlare del padre (e su molti sistemi Unix, il file non ha nome ;. è stato scollegato prima tmpfile() ritorna al chiamante)

extern FILE *tmpfile(void);

Quindi, si utilizza la creazione di file temporanei sbagliato primitiva se è necessario comunicare i nomi dei file in giro.

Si dispone di un certo numero di opzioni:

  1. Avere il processo padre crea i flussi di file con tmpfile() in modo che sia il genitore e figli condividono i file. Ci sono alcuni problemi minori di coordinamento per gestire -. Il genitore avrà bisogno di cercare di nuovo al punto di partenza prima di leggere quello che hanno scritto i bambini, e dovrebbe farlo solo dopo che il bambino è uscito
  2. Utilizzare una delle primitive di generazione nome del file, invece - mkstemp() è buona, e se avete bisogno di un puntatore a file invece di un descrittore di file, è possibile utilizzare fdopen() per creare uno. Sei ancora di fronte al problema di ottenere i nomi dei file, dai bambini ai genitori; ancora una volta, il genitore potrebbe aprire i file, oppure è possibile utilizzare un tubo per ogni bambino, o qualche memoria condivisa, o ... fate la vostra scelta dei meccanismi di IPC.
  3. Avere il genitore aprire un tubo per ogni bambino, prima che si biforcano. Il processo figlio chiude l'estremità di lettura del tubo e scrive al fine di scrittura; il genitore chiude l'estremità di scrittura del tubo e provvede a leggere dalla fine lettura. Il problema qui con i bambini più è che la capacità di un dato tubo è finita (e piuttosto piccola - di solito circa 5 KiB). Di conseguenza, è necessario garantire il genitore legge tutti i tubi completamente, tenendo presente che i bambini non saranno in grado di uscire fino a quando tutti i dati sono stati letti (rigorosamente, tutti tranne l'ultimo buffer pieno è stato letto).
  4. Considerare utilizzando thread - ma essere consapevoli dei problemi di coordinamento con le discussioni
  5. .
  6. Decidere che non è necessario utilizzare più thread di controllo - se i processi o thread - ma semplicemente avere il programma principale fanno il lavoro. Questo elimina il coordinamento e le questioni IPC -. Vuol dire che non potranno beneficiare del processore multi-core della macchina

Di questi, ipotizzando l'esecuzione parallela è di fondamentale importanza, probabilmente userei tubi per ottenere i nomi dei file da parte dei bambini (opzione 2); ha i problemi di coordinamento minor numero. Ma per semplicità, mi piacerebbe andare con 'principale del programma fa tutto' (opzione 5).

È possibile creare un file temporaneo nel processo padre e poi la forcella, quindi hai il processo figlio utilizzare tale.

Il processo figlio può rispedire il descrittore di file al processo padre.

EDIT: esempio di codice in APUE sito (src.tar.gz / apue.2e / lib, recvfd.c, sendfd.c)

Utilizzare le discussioni invece di sottoprocessi? Mettere i nomi dei file temporanei in un altro file? Non utilizzare nomi casuali per i file temporanei, ma (per esempio) i nomi in base al PID del processo genitore (per consentire più istanze del programma di operare contemporaneamente) più un numero sequenziale?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top