全部博文(47)
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呢?待以后请教下其他人。