Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147994
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 402
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-11 10:08
文章存档

2013年(47)

我的朋友

分类: C/C++

2013-06-19 18:09:18

首先明确一下,同一个文件在同一个进程中可以被打开多次,只是返回的文件描述符不同,但是read、write、lseek都是针对的同一个文件。

#include
#include<string.h>
#include
#include
#include
#include
#include
#include
#include

main(){ int fd1,fd2; if((fd1=open("./file1",O_RDWR))==-1)
        perror("openfd1"); if((fd2=open("./file1",O_RDWR))==-1)
        perror("openfd2");
    printf("fd1=%d\tfd2=%d\n",fd1,fd2);
    lseek(fd1,1,SEEK_SET); if(write(fd1,"a",1)==-1)
        perror("writefd1");
    lseek(fd2,2,SEEK_SET); if(write(fd2,"b",1)==-1)
        perror("writefd2");
    lseek(fd1,0,SEEK_SET); if(write(fd1,"c",1)==-1)
        perror("writefd1again");
    close(fd1);
    close(fd2);
}
 

最后文件中的内容是cab。fd1=3,fd2=4

子进程复制了父进程的文件描述符后,相当于文件再次被打开。

#include
#include<string.h>
#include
#include
#include
#include
#include
#include
#include

main(){ int fd1; if((fd1=open("./file1",O_RDWR))==-1)
        perror("openfd1");
    pid_t pid=fork(); if(pid==0){
        sleep(1); int fd2; if((fd2=open("./file1",O_RDWR))==-1)
            perror("openfd2");
        printf("fd1=%d\tfd2=%d\n",fd1,fd2);
        lseek(fd1,0,SEEK_SET); if(write(fd1,"a",1)==-1)
            perror("writefd1");
        lseek(fd2,1,SEEK_SET); if(write(fd2,"b",1)==-1)
            perror("writefd2");
        close(fd1);
        close(fd2);
    } else{
        printf("fd1=%d\n",fd1);
        lseek(fd1,0,SEEK_SET); if(write(fd1,"c",1)==-1)
            perror("writefd1again");
        close(fd1);
    }
}
 

上述代码相当于文件被打开了3次--所以也要close()3次,但是lseek跟文件打开几次没有关系,它只认那一个物理文件,所以文件最终的内容是:ab。

原文中的内容最后我有一些不懂,为什么是ab? 那c呢?待以后请教下其他人。

阅读(1747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~