2010-03-23 7 views
6

le seguenti uscite di codice "Illegal cercano":ftell (stdin) provoca un errore cercare illegale

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

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

Ciò si verifica quando si esegue "copione cat | ./a.out" così come quando ho appena eseguito " ./a.out". Il problema è con ftell, ovviamente. La mia domanda è: perché succede? Penserei che lo stdin possa essere ricercabile. fseek causa anche lo stesso errore. Se stdin non è ricercabile, c'è un modo in cui posso fare lo stesso genere di cose?

Grazie per le risposte.

+1

Qual è il problema che stai effettivamente cercando di risolvere con fseek? –

risposta

12

I fifos non sono cercabili. Sono semplicemente un buffer. Una volta che i dati sono stati read() da un buffer fifo, non possono mai essere recuperati.

Si noti che se è stato eseguito il programma:

./a.out < script 

ingresso allora standard sarebbe un file e non un fifo, così ftell() poi fare quello che ci si aspetta.

+2

+1 per un esempio che mostra la differenza tra 'cat file |./A.out' e' ./a.out

+0

@ R .. Qual è la differenza? – Calmarius

+0

@Calmarius: cat f | x usa un processo separato (e forse una CPU separata) per copiare un file in un fifo. il fifo viene letto dal processo x. se x fa cose diverse da read() questo potrebbe essere più veloce di se legge il file stesso. x geocar