免费注册 查看新帖 |

Chinaunix

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

问一个FILE结构的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-04 21:25 |只看该作者 |倒序浏览
因为在AIX 下定义

有 FILE->_file 表示当前已经打开的文件数。而

linux 好像没有这个成员。

struct _IO_FILE {
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

感觉都不像是。。。

请高手指点一下。

论坛徽章:
0
2 [报告]
发表于 2009-08-04 22:40 |只看该作者
首先,除非你是实现 libc 的程序员,否则你根本不需要了解 FILE 结构的细节。
FILE 的内部结构完全是由实现决定的。
依赖于实现相关的特性是一种非常糟糕的做法,不过也许 open() 返回的 fd 值在一定程度上可以表示已经打开的文件数。
如果你希望准确获得当前已经打开的文件数量,你就应该自己定义一个全局变量,然后每次打开成功后都 +1,关闭后 -1。



[ 本帖最后由 langue 于 2009-8-4 22:46 编辑 ]

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
3 [报告]
发表于 2009-08-04 23:57 |只看该作者

回复 #2 langue 的帖子

是的,我觉得open返回的fd内部应该有一个类似ref_count变量,记录打开的个数,close只不是过将这个变量减1,当减到0时真正释放和这个fd相关的资源。这个可以通过fork来验证,fork后要在父子程序里分别调用close才能真正关掉这个fd。对于sockfd也是同样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP