C - Come individuare i file temporanei creati in precedenza da tmpfile ()?
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.
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:
- 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 - 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 utilizzarefdopen()
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. - 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).
- Considerare utilizzando thread - ma essere consapevoli dei problemi di coordinamento con le discussioni .
- 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?