作者anoymouse (沒有暱稱)
看板C_and_CPP
標題[問題] stdin問題請益
時間Thu Dec 5 15:50:11 2019
Linux
GCC
http://man7.org/tlpi/code/online/dist/altio/t_select.c.html
因為程式沒有任何讀取的動作,所以stdin buffer裡面的資料會導到shell上。
https://imgur.com/Mua5xCJ
比如只按enter 命令提示就會再跳一個$
如果是ls + enter, ls 就會導到shell,然後變成shell command。
在程式exit(EXIT_SUCCESS)前放一個getchar(),單一字元就不會導到shell。
但是如果是輸入ls再加enter,為什麼s + 換行符並沒有導到shell上?
getchar 不是只吃一個字元而已嗎,剩下的還再buffer裏面?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.120.33.176 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1575532214.A.75D.html
1F:推 Schottky: 問題是你說的 buffer 是什麼 buffer XDDDD 12/05 16:14
2F:→ Schottky: getchar() 是 stdio function, stdio 預設對於 termianl 12/05 16:17
3F:→ Schottky: 是 line buffered,而這個 buffer 不是你說的那個buffer 12/05 16:17
4F:→ Schottky: 改用 read() 只讀一個 char 應該就是你要的效果了 12/05 16:19
5F:→ anoymouse: stdin有幾個buffer? 整個過程不是一個line buffer? 12/05 16:33
6F:推 Schottky: 你以為 getchar() 只吃一個字,其實他吃了一整行 12/05 22:57
7F:→ anoymouse: 我看網上是說一個字元耶 該怎麼理解所謂一整行? 12/06 08:04
8F:推 LPH66: getchar() 是從 line buffer 裡取出一個字元 12/06 08:29
9F:→ LPH66: 而 line buffer 在有人向它要東西時已經從終端吃一行進來了 12/06 08:30
10F:→ LPH66: 這個終端才是你所提的 stdin 內容 12/06 08:31
11F:→ anoymouse: 釐清一下line buffer是kernel buffer? 12/06 19:56