关于linux中进程打开同一文件操作的一点分析
2011-11-29 11:31
399 查看
关于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 不同进程之间 结论成立,每个进程即便是打开了同一文件,仍然有自己独立的文件偏移
相关文章推荐
- 关于linux的最大打开进程及最大打开文件数 - linux - 第六空间
- linux的一些基本命令(关于文件操作, 进程操作,以及/boot问题)
- Linux下文件操作的基本函数及分析
- 你一定要知道的关于Linux文件目录操作的12个常用命令
- Linux进程-fork创建新进程之文件分析
- linux下进程的进程最大数、最大线程数、进程打开的文件数和ulimit命令修改硬件资源限制
- Linux下查看进程打开的文件句柄数和如何修改
- 关于Linux的进程和线程分析
- Linux下多个进程或线程同时对一个文件进行写操作
- linux命令 — lsof 查看进程打开那些文件 或者 查看文件给那个进程使用
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- 修改linux用户的可以打开的最大文件数和进程数(fork: retry: Resource temporarily unavailable)
- linux下进程的最大线程数、进程最大数、进程打开的文件数
- 关于++与+=操作的一点分析
- linux中关于创建子进程系统堆栈的分析
- 关于去掉linux打开文件数限制的方法
- Linux下如何查看进程打开的文件以及修改进程打开文件数上限
- Linux下多个进程或线程同时对一个文件进行写操作
- Linux下查看进程打开的文件与打开文件的进程
- linux基础——关于chmod用户权限和文件的相关操作