免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2346 | 回复: 7
打印 上一主题 下一主题

getchar read 具体是怎么各流程呀 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-16 15:03 |只看该作者 |倒序浏览
int main( )
{
        int i;
        char ch;

          i=printf("Hello,\n world");
        ch=getchar();
}
int main( )
{
        int i;
        char ch;

          i=printf("Hello,\n world");
        read(0,&ch,1);
}
这两个为什么不同。
getchar 时 能先打印world然后在等待输入、而read时先等待输入然后在打印world .

看到以前帖子 所以知道 ,一般时行模式,所以执行完printf,"Hello,"能先显示到屏幕上而world还在缓存中.
但getchar 函数运行后,为什么world也显示了,网上对getchar的描述中没有涉及到他会对输出缓存操作呀。

论坛徽章:
0
2 [报告]
发表于 2007-11-16 15:14 |只看该作者
强, 潜水都快五年了.

论坛徽章:
0
3 [报告]
发表于 2007-11-16 15:20 |只看该作者
一个带缓冲, 一个不带
>>但getchar 函数运行后,为什么world也显示了
这个是肯定会显示的

论坛徽章:
0
4 [报告]
发表于 2007-11-16 17:01 |只看该作者
能详细一点吗getchar 带缓冲 ,那它怎么影响了输出缓冲呀 难道时它会先清输出缓冲 然后在操作,但这个好像没有看到哪里有过说明。

论坛徽章:
0
5 [报告]
发表于 2007-11-16 17:12 |只看该作者
http://blog.chinaunix.net/u1/35100/showart_400190.html

原帖由 asdmusic 于 2007-11-16 17:01 发表
能详细一点吗getchar 带缓冲 ,那它怎么影响了输出缓冲呀 难道时它会先清输出缓冲 然后在操作,但这个好像没有看到哪里有过说明。

论坛徽章:
0
6 [报告]
发表于 2007-11-18 09:37 |只看该作者
看了 ,
3. 再次要求从内核中得到数据时;比如上面的程序加上getchar()会导致马上输出
但还是不详细。也只是这样说而已,这个函数的代码在那个文件中,我找了好些时候多没有看到
glibc-2.6.1  gcc 和 linux-2.6.21.tar.bz2 中都没有搜索到

论坛徽章:
0
7 [报告]
发表于 2007-11-18 09:56 |只看该作者
已经很明白了, 只有一个缓冲区, 读写一起用
读的时候, 写的还没有被输出的会马上输出

原帖由 asdmusic 于 2007-11-18 09:37 发表
看了 ,
3. 再次要求从内核中得到数据时;比如上面的程序加上getchar()会导致马上输出
但还是不详细。也只是这样说而已,这个函数的代码在那个文件中,我找了好些时候多没有看到
glibc-2.6.1  gcc 和 linux-2 ...

论坛徽章:
0
8 [报告]
发表于 2007-11-18 12:03 |只看该作者
哦 这样啊 我找到了
int
getchar ()
{
  int result;
  _IO_acquire_lock (_IO_stdin);
  result = _IO_getc_unlocked (_IO_stdin);
  _IO_release_lock (_IO_stdin);
  return result;
}

查看_IO_getc_unlocked
#define _IO_getc_unlocked(_fp) \
       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
        ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)

查看__uflow
int
__uflow (fp)
     _IO_FILE *fp;
{
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
  if (_IO_vtable_offset (fp) == 0 && _IO_fwide (fp, -1) != -1)
    return EOF;
#endif

  if (fp->_mode == 0)
    _IO_fwide (fp, -1);
  if (_IO_in_put_mode (fp))
    if (INTUSE(_IO_switch_to_get_mode) (fp) == EOF)
      return EOF;
。。。。。
查看INTUSE(_IO_switch_to_get_mode) (fp)  
int
_IO_switch_to_get_mode (fp)
     _IO_FILE *fp;
{
  if (fp->_IO_write_ptr > fp->_IO_write_base)//如果有输出数据
    if (_IO_OVERFLOW (fp, EOF) == EOF)

查看 _IO_OVERFLOW
/* The 'overflow' hook flushes the buffer.
   The second argument is a character, or EOF.
   It matches the streambuf:verflow virtual function. */
typedef int (*_IO_overflow_t) (_IO_FILE *, int);
#define _IO_OVERFLOW(FP, CH) JUMP1 (__overflow, FP, CH)
#define _IO_WOVERFLOW(FP, CH) WJUMP1 (__overflow, FP, CH)

就不往下了
原来是这么回事
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP