作者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/cn.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