Tengo el siguiente fragmento de código C, que se lee de un tubo y luego debería bloquear pero nunca bloquesno lee bloqueo en nombre de tubería
int pipe_fd;
int res;
int open_mode = O_RDONLY;
char buf[100];
int bytes_read = 0;
memset (buf, '\0', sizeof(buf));
pipe_fd = open(FIFO_NAME, open_mode);
if (access(FIFO_NAME, F_OK) == -1)
{
res = mkfifo(FIFO_NAME, 0777);
if (res != 0)
{
fprintf (stderr, "Could not create fifo %s\n", FIFO_NAME);
exit (EXIT_FAILURE);
}
}
for(;;)
{
do
{
res = read(pipe_fd, buf, sizeof(buf));
bytes_read += res;
}while (res > 0);
// process data then go back and block
............
}
Se envía un buffer sencilla por cierto código en un script bash así' ./test 1'
#!/bin/bash
pipe=/tmp/pipe
if [[ ! -p $pipe ]]; then
echo "Reader not running"
exit 1
fi
if [[ "$1" ]]; then
echo "some string" >$pipe
else
echo "q" >$pipe
fi
que ejecutar el programa de código C en el BGF y en un principio lo hace en el bloque de lectura, pero tan pronto como me llamo la escritura del golpe sin el código C bloques más largos, lo hace con éxito lea los datos de el búfer y luego cada vez que lea hay 0 bytes leídos así que no estoy seguro de por qué ya no está bloqueando. Los datos de 'algunas cadenas' se reciben correctamente en el otro lado.
Sólo necesito que se siente allí esperando para el proceso de datos y luego ir a esperar a más
muchas gracias, no me di cuenta. ¿Debo cerrar el fifo después de recibir EOF antes de reabrirlo? – tech74
@ tech74: Obviamente. 'open()' asigna un nuevo descriptor de archivo - el anterior tiene que ser liberado usando 'close()'. Los escritores también bloquearán hasta que vuelvas a abrir FIFO para leer nuevamente. – Dummy00001
+1 para el enlace! –