981013 发表于 2014-9-8 11:30 是的 另外文档下面标着BSD,说明在BSD系统中应该都是这样 另,现在没有Mac OS,只有OS X |
论坛出毛病了,发的时候说内部错误,结果发了三遍 |
rosynirvana 发表于 2014-9-7 21:58 也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取? |
rosynirvana 发表于 2014-9-7 21:58 也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取? |
rosynirvana 发表于 2014-9-7 21:58 也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取? |
当时的回复有个地方不怎么确定,这个问题其实可以比照一下OSX和Linux的man page OSX getchar (3) The end-of-file condition is remembered, even on a terminal, and all subsequent attempts to https://developer.apple.com/libr ... man3/getchar.3.html linux getchar (3) http://man7.org/linux/man-pages/man3/getchar.3.html 没有强调terminal会记住EOF的状态 |
简单的对应方法
可能在libc或者系统接口上OS X和Linux的实现有点不同 |
981013 发表于 2014-3-23 15:20 确实是个问题,让我研究研究看看 |
rosynirvana 发表于 2014-3-23 15:08 是bash 不过一般用的是xCode的虚拟终端 |
981013 发表于 2014-3-23 15:07 你在OS X下面用的是哪个shell? bash还是其他的? 我去试试看 |
rosynirvana 发表于 2014-3-23 14:54 就是不停输出-1 |
981013 发表于 2014-3-23 14:48 没明白,那段本来就是死循环啊? |
rosynirvana 发表于 2014-3-21 21:28 Mac OS (UNIX)下这段代码就死循环了其他系统下都没问题 |
本帖最后由 rosynirvana 于 2014-3-21 23:31 编辑 然后是linux下的测试 linux下在同一行输入ctrl+d,会刷新缓冲区 在新一行输入ctrl+d,会输入一个EOF 和上面相同的测试代码 输入 1 输出 49 10 输入 2 输出 50 10 输入 ctrl+d 输出 -1 输入 2ctrl+d 整体效果 2 50 换而言之就是自动补充了一个回车来换行 测试原始的代码,在2后面输入ctrl+d什么都不会发生,interesting |
本帖最后由 rosynirvana 于 2014-3-21 21:35 编辑 首先,和系统处理回车的方式无关 测试代码
输入 1 显示 49 10 输入 2 显示 50 10 所以程序认为缓冲区中只有\n 然后输入 2ctrl+z 显示 50 26 输入 ctrl+z 显示 -1 EOF在大多数编译环境中的定义是-1 所以可以看到,只有在新一行输入ctrl+z,才会被认为是EOF信号,而同一行则不会。 同样,最初的那份代码,如果正确地在新一行输入ctrl+z是不会有问题的,如果在同一行输入就会造成残留字符 看来windows下是这个问题 unix……嗯让我先把raspberry刷一遍再去测试XD |