免费注册 查看新帖 |

Chinaunix

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

请问个文件系统的编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-04 11:33 |只看该作者 |倒序浏览
最近在看 <<unix系统编程>>,看到文件操作(4.6节)时遇到个问题.
对于下面这个程序说是由于子进程拷贝了父进程的一份文件描述符表,两个都指向内核区的系统文件表的同一个条目,所以他们共享相同的文件偏移量(这个应该是指文件的读写指针的意思吧).
所以下面程序的输出结果是
Process nnn got a
Process mmm got b
我现在的问题是,这样是不是意味着文件偏移量(应该是指文件的读写指针)是存放在 内核区的 系统文件表中?
但是我在一本操作系统书上(北京大学的操作系统教材)文件系统,文件的实现一章节中看到
文件系统的实现需要系统打开文件表(整个系统一张)和用户打开文件表(每个进程一个),其中文件的读写指针是存放在用户打开文件表中,这于我前面推断的 应存放在 系统文件表中相矛盾,不知道究竟是什么原因?
我测试的<<unix系统编程>>的程序的输出确实如上面, 是因为我的理解有误: <<unix系统编程>>中的系统文件表和文件描述符表与操作系统书上的系统打开文件表和用户打开文件表不是一回事,
还是因为是操作系统不同造成的实现上的差异?或者是其他原因,请高手指教.多谢.
程序附在下面:只在freebsd 上作了测试,输出结果是 a b
Example 4.27 openfork.c
(其中my.dat的内容是 abcdef)
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

int main(void) {
   char c = '!';
   int myfd;

   if ((myfd = open("my.dat", O_RDONLY)) == -1) {
      perror("Failed to open file");
      return 1;
   }
   if (fork() == -1) {
      perror("Failed to fork");
      return 1;
   }
   read(myfd, &c, 1);
   printf("Process %ld got %c\n", (long)getpid(), c);
   return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-09-14 20:35 |只看该作者
说不定那本书说的是windows系统实现方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP