关于linux中进程打开同一文件操作的一点分析
按照系统的设计,每个进程自己维护一张打开表
索引 文件描述符 文件指针
0 close_on_exec 0x.....
.............
然后内核会维护一张表,这个表表示所有打开的文件,每个文件一行不会重复。
里面存储有文件的当前状态,也就是为什么有进程锁定后,其他进程不能写。状态值就是写在这里的。
然后内核说虽然多个进程打开同一文件仅仅是指向了同一个索引位置,但是每个进程却有自己独立的偏移。
于是我做了2个测试。
1)父子进程之间
2)无关联的2个进程之间
-------------------------------------------------------------
----------------------------------------------------------------------
结论:
情况1 父子进程之间 文件偏移像是一个共享的字段,不论谁修改了读取的都是最新的值,可能原因是子进程复制了父进程所有东西的时候,有的还不是完全复制
情况2 不同进程之间 结论成立,每个进程即便是打开了同一文件,仍然有自己独立的文件偏移
按照系统的设计,每个进程自己维护一张打开表
索引 文件描述符 文件指针
0 close_on_exec 0x.....
.............
然后内核会维护一张表,这个表表示所有打开的文件,每个文件一行不会重复。
里面存储有文件的当前状态,也就是为什么有进程锁定后,其他进程不能写。状态值就是写在这里的。
然后内核说虽然多个进程打开同一文件仅仅是指向了同一个索引位置,但是每个进程却有自己独立的偏移。
于是我做了2个测试。
1)父子进程之间
2)无关联的2个进程之间
-------------------------------------------------------------
代码如下:
1 #include "apue.h"
2 #include <fcntl.h>
3
4 int main(void)
5 {
6 int fd;
7 off_t off = 0;
8 pid_t pid = 0;
9 const char * file = "add2";
10 fd = open(file, O_RDONLY);
11 off = lseek(fd, 10, SEEK_CUR);
12 printf("current process %d, offset %d\n", getpid(), off);
13 sleep(100);
14 /* pid = fork();
15 if ( pid > 0)
16 {
17 waitpid(pid);
18 off = lseek(fd, 0, SEEK_CUR);
19 printf("current process %d, offset %d\n", getpid(), off);
20 exit(0);
21 }
22 else if ( pid == 0)
23 {
24 printf("current process %d, offset %d\n", getpid(), off);
25 off = lseek(fd,10, SEEK_CUR);
26 sleep(5);
27 } */
28 return 0;
----------------------------------------------------------------------
结论:
情况1 父子进程之间 文件偏移像是一个共享的字段,不论谁修改了读取的都是最新的值,可能原因是子进程复制了父进程所有东西的时候,有的还不是完全复制
情况2 不同进程之间 结论成立,每个进程即便是打开了同一文件,仍然有自己独立的文件偏移