父子进程通过共享文件描述符,同时读写同一文件

yuzhen_3301 2015-04-18 02:50:08
父进程首先打开一个空文件,然后调用fork创建子进程。
子进程向文件写入“databuffer”,结束。
父进程从文件中读取数据,但失败。总是读不到子进程已经写入到文件中的数据。

代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

int main(int argc, char** argv){
pid_t pid;
int fd = open("./data.dat", O_RDWR|O_TRUNC, 0);
if(fd == -1){
printf("open fails\n");
exit(1);
}
char buf[] = "databuffer\n\0";
if((pid = fork()) < 0){
printf("fork error\n");
return -1;
}else if(pid == 0){
write(fd, buf, strlen(buf));
fsync(fd);
close(fd);
return 0;
}

wait(NULL);
memset(buf, 0, sizeof(buf)/sizeof(char));
lseek(fd, 0, SEEK_SET);
read(fd, buf, strlen(buf));
printf("%s\n", buf);
return 0;
}


上述代码执行后,输出为空。正常的执行结果应是打印出"databuffer"。

相关链接:http://bbs.csdn.net/topics/230005905
http://blog.csdn.net/ordeder/article/details/21716639
...全文
697 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luo6620378xu 2015-04-19
  • 打赏
  • 举报
回复
楼主你代码的思路没有问题。 父子进程是通过各自进程的文件表项共享同一个文件的索引节点来实现共享文件的。 也就是说在fork之后父子进程中指向同一个文件的fd是一样的。 你的问题在于在父进程中read时 memset(buf, 0, sizeof(buf)/sizeof(char)); read(fd, buf, strlen(buf)); strlen(buf)=0你要求系统调用读0个字节,当然啥也读不到。 换成sizeof,应该就可以读到数据了。
lucky-lucky 2015-04-18
  • 打赏
  • 举报
回复
引用 6 楼 yuzhen_3301 的回复:
@p569354158,“databuffer\n\0”存储在栈上,而不是常量区或者只读内存区里。
这里使用这个是没问题的,但是最好不要这样使用,因为read的时候读取的内容可能会大于databuffer的大小,它的后面存的东西会被覆盖。
yuzhen_3301 2015-04-18
  • 打赏
  • 举报
回复
@p569354158,“databuffer\n\0”存储在栈上,而不是常量区或者只读内存区里。
yuzhen_3301 2015-04-18
  • 打赏
  • 举报
回复
@p569354158, buf确实存储的是常量字符串。但这里,常量字符串没用,可以随便覆盖。 你的答案正确,谢谢,把分给你。
yuzhen_3301 2015-04-18
  • 打赏
  • 举报
回复
@p569354158 , 你说得对,read应该改成read(fd, buf, sizeof(buf)/sizeof(char)-1);
lucky-lucky 2015-04-18
  • 打赏
  • 举报
回复

memset(buf, 0, sizeof(buf)/sizeof(char));
    lseek(fd, 0, SEEK_SET);
    read(fd, buf, strlen(buf));
buf已经被你memset了,使用strlen得到的当然是0,你read的语句其实是: read(3,buf,0); 所以你什么都读不上来了。 另外你的buf指向的空间为常量区,你确定要这么使用么?
yuzhen_3301 2015-04-18
  • 打赏
  • 举报
回复
子进程可以关闭文件描述符,建议看《Unix环境高级编程》。
youzi05 2015-04-18
  • 打赏
  • 举报
回复
子进程能关闭文件描述符吗?我感觉应该是:

  write(fd, buf, strlen(buf));
   fflush();      // 刷新, 可能函数名错了 , 意思到就行了
   fsync(fd);

23,120

社区成员

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

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