2015-05-23 18 views
5

Quando reindirizzo un file a stdin utilizzando il comando MyProgram < cl.txt dalla riga di comando, scanf s non mi aspetto di premere Invio.In che modo scanf determina se bloccare?

Ma quando uso il scanf nel mio programma senza farlo, blocca fino a quando non viene premuto il tasto Invio.

Come lo determina esattamente? Continua a leggere lo stream fino a quando non si incontra lo \n? o mi aspetta davvero di premere un tasto?

Quando non scrivo nulla e premere Invio, non smette di bloccarsi e continua a chiedere. Sono veramente confuso.

+1

Con 'MyProgram

risposta

6

scanf sta leggendo solo dal suo flusso di input. Se il flusso di input è una pipe e l'altra estremità di tale pipe è associata a una tty (che di solito è il caso se si immettono dati in modo interattivo premendo i tasti su una tastiera), scanf tornerà non appena leggerà i dati che completa la sua stringa di formato (o non riesce a combaciare). Il tty, tuttavia, se è in modalità cotta (che è l'impostazione predefinita e, a meno che tu non faccia uno sforzo per mettere il tty in modalità raw, dovresti assumere che stia cucinando quello che scrivi), non scriverà alcun dato nella pipe fino a quando non si preme il ritorno.

In altre parole, non è il tuo scanf che sta bloccando. (Beh, sta bloccando, ma non è la fonte del ritardo con esperienza.) Piuttosto, il driver tty sta aspettando che tu colpisca il ritorno prima che passi qualsiasi dato al tuo programma.

+0

Quando premo invio senza digitare nulla è il sistema operativo che ignora quell'input o è esso stesso scanf? –

+0

@InsignificantPerson Non penso che scanf ignori l'input, vuole solo più input, e dato che non ci sono più dati nel buffer di input, stdin blocca fino all'arrivo dei dati. – Suma

+1

@InsignificantPerson Dipende dalla stringa di formato, ma spesso le stringhe di formattazione sono tali che scanf ignora gli spazi bianchi iniziali.In tal caso, la tua solitaria newline viene letta (ma ignorata) mentre scanf continua a cercare i dati in modo che corrispondano alla stringa di formato. –

2

Quando si chiama scanf, attende immediatamente l'input. nel tuo primo esempio, l'input è fornito sotto forma di "cl.txt". Nel secondo esempio, non viene fornito alcun input finché non si preme un tasto. L'I/O sincrono bloccherà il suo thread in esecuzione fino a quando non riceverà input.

5

Continua a leggere lo stream finché non si incontra \ n '?

Normalmente stdin è in modalità di buffer linea (_IOLBF, vedi setvbuf). Ogni volta che il buffer è vuoto, stdin attende un'intera linea nuova da inserire, vale a dire aspetta fino a quando si preme Invio e \n è inserito nel buffer:

su input, il buffer viene riempito fino al successivo carattere di nuova riga quando viene richiesta un'operazione di input e il buffer è vuoto.

Nota: la console (terminale) spesso implementa un buffering da solo e non invia alcun dato allo stream finché non si preme Invio - questo consente di modificare i dati (ad esempio, usare delete e tasti backspace) prima di inviarli all'applicazione. Pertanto, anche senza buffer sul lato stdin (come quando si esegue setvbuf(stdin, NULL, _IONBF, 0)), lo scanf può ancora attendere fino a quando non viene premuto Invio.

Problemi correlati