Sto implementando piping su un file system simulato in C++ (principalmente C). È necessario eseguire comandi nella shell host, ma eseguire le tubazioni stesse sul file system simulato.Può popen() creare pipe bidirezionali come pipe() + fork()?
ho potuto ottenere questo con le chiamate di sistema pipe()
, fork()
e system()
, ma preferisco utilizzare popen()
(che gestisce la creazione di un tubo, si biforcano un processo, e passando un comando alla shell). Questo potrebbe non essere possibile perché (credo) ho bisogno di essere in grado di scrivere dal processo padre della pipe, leggere sul processo figlio fine, scrivere l'output dal figlio e infine leggere quell'output dal genitore. La pagina man per popen()
sul mio sistema dice che è possibile una pipa bidirezionale, ma il mio codice deve essere eseguito su un sistema con una versione precedente che supporta solo pipe unidirezionali.
Con le chiamate separate di cui sopra, posso aprire/chiudere i tubi per raggiungere questo obiettivo. È possibile con popen()
?
Per un esempio banale, eseguire ls -l | grep .txt | grep cmds
devo:
- Apri un tubo e processo per l'esecuzione
ls -l
sull'host; leggere la sua uscita posteriore - pipe l'output di
ls -l
tornare al mio simulatore - Aprire un tubo e processo per l'esecuzione
grep .txt
sull'host sull'uscita sottofondo dils -l
- pipe l'output di questo ritorno al simulatore (bloccato qui)
- Aprire un tubo e processo per l'esecuzione
grep cmds
sull'host sull'uscita sottofondo digrep .txt
- tubo l'uscita di questo nuovo al simulatore e stamparlo
uomo popen
Da Mac OS X:
La funzione
popen()
'apre' un processo creando un bidirezionale tubo, si biforcano, e invocando la shell. Qualsiasi flusso aperto dalle precedentipopen()
le chiamate nel processo principale sono chiuse nel nuovo processo figlio. Storicamente,popen()
è stato implementato con un tubo unidirezionale; quindi, molte implementazioni dipopen()
solo consentono all'argomento della modalità di specificare lettura o scrittura, non entrambe. Poichépopen()
è ora implementato utilizzando una pipe bidirezionale , l'argomento della modalità potrebbe richiedere un flusso di dati bidirezionale. L'argomento della modalità è un puntatore a una stringa con terminazione null che deve essere "r" per la lettura, "w" per la scrittura o "r +" per la lettura e la scrittura.
ignorano questo manuale di male, che sta facendo sembrare unidirezionalità dei tubi è un comportamento legacy. Il comportamento della tua implementazione è non standard e probabilmente non sarà mai supportato in altri ambienti. Basta impostare i tubi e la forchetta ed eseguire l'operazione, e tutto sarà felice. –
L'intera discussione è fatta di vincita, tutte le risposte e la domanda meritano +1. –
Ho appena fatto un ** popen ** su Ubuntu 13.04 e afferma: 'Poiché un pipe è per definizione unidirezionale, l'argomento type può specificare solo lettura o scrittura, non entrambi; il flusso risultante è corrispondentemente di sola lettura o solo in scrittura. Sono sorpreso che questo è il popen "vecchio" ... – sager89