Alcuni mesi fa scrivo un'applicazione CGI per Linux che utilizza popen()
per leggere l'output di un comando, quindi chiudo la pipa con fclose()
.usare fclose to pipe of popen è un bug serio?
Ora, ho letto che per tubi stretti è necessario utilizzare pclose()
.
Il manuale dice:
Il valore restituito da
popen()
è un flusso normale standard di I/O in tutti gli aspetti salvo che esso deve essere chiuso conpclose()
piuttosto chefclose(3)
.
Il mio codice è simile a questo:
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
La mia domanda è:
Il mio errore ha un problema di sicurezza? Il programma è attualmente in produzione. Nei test non fa niente. E 'davvero necessario, patch usando invece fclose()
? Nota: apro il PIPE solo una volta nel programma.
Oggi, nella mia casa locale faccio un po 'di test e fclose()
e pclose()
non tornare EOF che indica il fallimento.
Hai comportamento indefinito : Leggi ['pclose()' vs 'fclose()'?] (Http://cboard.cprogramming.com/cplusplus-programming/97147-pclose-vs-fclose.html): La funzione '_pclose' cerca il ID di processo del processore di comandi (CMD.EXE) avviato dalla chiamata '_popen' associata, esegue una chiamata' _cwait' sul nuovo processore di comandi e chiude lo stream sulla pipe associata. –
Ci sono alcuni post SO relativi alla tua domanda: 1. ['fclose ()/pclose() 'può bloccare su alcuni puntatori di file] (http://stackoverflow.com/questions/1736983/fclose-pclose-may-block-on-some-file-pointers) e [Come chiudere il pipe handle in unix ? '(fclose() di pclose())'?] (http://stackoverflow.com/questions/5548364/how-close-pipe-handle-in-unix-fclose-of-pclose) –
grazie, correggerò perché è veramente importante Ora, sembro l'impatto. – carlos