2010-03-23 19 views
6

Las siguientes salidas de código de "ilegal buscan":ftell (entrada estándar) hace que buscan ilegal de error

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 

int main() { 
    errno = 0; 
    getchar(); 
    getchar(); 
    getchar(); 
    ftell(stdin); 
    printf("%s\n", strerror(errno)); 
} 

Esto ocurre cuando corro "guión gato | ./a.out", así como cuando acabo de correr " ./a.out ". El problema es con Ftell, por supuesto. Mi pregunta es: ¿por qué ocurre esto? Yo pensaría que stdin puede ser buscable. fseek también causa el mismo error. Si stdin no es buscable, ¿hay alguna forma en que pueda hacer el mismo tipo de cosas?

Gracias por sus respuestas.

+1

¿Cuál es el problema que estás tratando de resolver con fseek? –

Respuesta

12

Fifos no son buscables. Ellos son simplemente un amortiguador. Una vez que los datos han sido read() desde un buffer fifo, nunca pueden ser recuperados.

Tenga en cuenta que si se ejecutó el programa:

./a.out < script 

de entrada estándar sería entonces un archivo y no un FIFO, por lo ftell() a continuación, hacer lo que se espera.

+2

+1 para un ejemplo que muestra la diferencia entre 'cat file |./A.out' y' ./a.out

+0

@R .. ¿Cuál es la diferencia? – Calmarius

+0

@ Calmarius: cat f | x usa un proceso separado (y tal vez una CPU independiente) para copiar un archivo en una fifo. el fifo está siendo leído por el proceso x. si x hace otras cosas que no sean read(), esto puede ser más rápido que si lee el archivo en sí. x geocar

Cuestiones relacionadas