Pregunta

¿Hay alguna forma de suprimir la salida de popen() sin perder la espera ().

Prueba 1:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

Prueba 2:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet &> /dev/null", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

El problema con Prueba 2 es eso pclose() no está esperando que la tubería finalice el procesamiento. No quiero tener un montón de salida FFMPEG cada vez que tengo que hacer una tubería.

¿Fue útil?

Solución

Solo deberías usar popen() Cuando desea enviar datos o leer datos desde el proceso infantil (y ese es un exclusivo o; si desea hacer ambas cosas, debe configurar la conexión usted mismo).

Si no quieres hacer eso, no uses popen().

Como Jim McNamara precisamente explicado, dado que redirige la salida del niño a /dev/null Después de crear la tubería, la redirección cierra la entrada de la tubería a su programa, por lo que popen() Obtiene cero bytes para leer, lo que cuenta como EOF. Y regresa: no hay nada más para leer (si podría haber más para ello, no habría recibido EOF).

En este contexto, usa system(); Esperará a que el niño termine, incluso cuando la salida del niño sea redirigida a /dev/null. En otros contextos, podría ser apropiado usar el nivel inferior fork() y exec*() rutinas en su lugar.

Otros consejos

La salida a /dev /null significa que Popen (que está llamando a Read ()) no bloquea en un descriptor de archivo cerrado para STDOUT. Vuelve de inmediato.

Cerras efectivamente stdout redirigiéndolo (dup ()), en realidad devuelve EOF

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top