- 论坛徽章:
- 0
|
最近在看 <<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;
} |
|