父子进程共享文件描述符问题

fengyvn 2008-05-13 10:05:00
fork()以后,父子进程应该是指向相同的文件表,但为什么子进程关闭文件后父进程还可以读入数据?

int main()
{
pid_t pid;
int fid = open("./data.dat", O_RDWR, 0);
char buffer[] = "databuffer\0";
if ((pid = fork()) < 0)
{
cerr<<"error"<<endl;
return -1;
}
else
if (pid ==0)
{
write(fid, buffer, 10);
close(fid); //子进程关闭文件
return 0;//进程正常退出
}

sleep(5);
lseek(fid, 0, SEEK_SET);
read(fid, buffer, 10);//关闭后父进程还可以从文件中读数据?
cout<<buffer<<endl;
return 0;
}
...全文
1337 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwsummer1 2008-05-19
  • 打赏
  • 举报
回复
楼上的,文件表项到底相同还是不同?
如果是fork 产生的子进程,则父子进程的文件表项相同
如果不同进程分别调用open(),则各自的进程的文件表项不同
tianjiao85 2008-05-15
  • 打赏
  • 举报
回复
学习
fengyvn 2008-05-15
  • 打赏
  • 举报
回复
哪位解释一下对文件表项引用计数的概念
air_snake 2008-05-14
  • 打赏
  • 举报
回复
你看UNIX高级环境编程相关的部分,很详细
fengyvn 2008-05-14
  • 打赏
  • 举报
回复
当2个不相关的进程分别打开同一个文件时
这句话是指不通过fork(),而是分别open()吗?
引用计数的概念有没有相关的详细资料,谢谢了。
cceczjxy 2008-05-14
  • 打赏
  • 举报
回复
父子进程内的进程描述符各自是独立的。
fengyvn 2008-05-14
  • 打赏
  • 举报
回复
//指向相同的文件表项,这个文件表项指向一个vnode 结构

//每个进程的文件描述符指向不同的文件表项,但不同的文件表项指向同一个vnode结构

楼上的,文件表项到底相同还是不同?
hwsummer1 2008-05-14
  • 打赏
  • 举报
回复
我想问的就是父子进程到底是不同的文件描述符指向相同的文件表项还是各自独立的文件描述符指向不同的文件夹项?
指向相同的文件表项,这个文件表项指向一个vnode 结构

当2个不相关的进程分别打开同一个文件时,每个进程的文件描述符指向不同的文件表项,但不同的文件表项指向同一个vnode结构


读写的文件指针保存在文件表项里,所以父子进程打开同一个文件时共享文件偏移指针,不同进程打开同一问题,各有自己的文件指针,读写时也要注意
hwsummer1 2008-05-14
  • 打赏
  • 举报
回复
兄弟,你那么做,父子进程读写数据会错乱


父子进程应该是指向相同的文件表,但为什么子进程关闭文件后父进程还可以读入数据?
文件表,也就是vnode数据结构,也可以说是内核对象,它里面有个计数器变量,表示有几个进程打开此文件
所以子进程关闭,父进程仍然可以读数据

geldqb 2008-05-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengyvn 的回复:]
to mymtom
我想问的就是父子进程到底是不同的文件描述符指向相同的文件表项还是各自独立的文件描述符指向不同的文件夹项?
我理解的文件表项就是中间那个结构。
[/Quote]

不同的文件描述符对应相同的文件表。
文件表加节点表就是物理文件。

文件描述符隶属于进程数据的一部分,
换言之各个进程的文件描述符彼此独立,
不管它们在数值是相同还是不同,
都不具备可比性。
fuqd273 2008-05-14
  • 打赏
  • 举报
回复
http://book.csdn.net/BookFiles/418/img/image100.jpg
图中间的那个表应该是进程独立的吧
这个表项中存有文件偏移量,这个数据肯定是进程间相互独立的。
fengyvn 2008-05-14
  • 打赏
  • 举报
回复
to mymtom
我想问的就是父子进程到底是不同的文件描述符指向相同的文件表项还是各自独立的文件描述符指向不同的文件夹项?
我理解的文件表项就是中间那个结构。
mymtom 2008-05-13
  • 打赏
  • 举报
回复
文件描述符是进程数据的一部分(进程相关)。子进程中关闭了,不影响父进程使用。
看这个图:
http://book.csdn.net/BookFiles/418/img/image100.jpg

或者参考这个帖子
http://topic.csdn.net/u/20071001/09/87135a4f-878f-47b7-934b-c230266a1f87.html

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧