当利用lseek修改current offset为5时,再read,结果如下:
bbbbb
这说明read可以不受O_APPEND的影响,可以自由读取文件中任意位置的内容。将上述代码这样修改后:
int main()
{
int fd;
char buf[100]="abcde";
//注:temp中只有一行aaaaabbbbbccccc.
if( (fd=open("temp",O_RDWR|O_APPEND))<0 )
err_sys("error open!");
//if(lseek(fd,5,SEEK_SET)==-1)
// err_sys("error lseek!");
//if( read(fd,buf,5)<0 )
// err_sys("error read!");
//buf[5]='\0';
//printf("%s\n",buf);
if(write(fd,buf,5)!=5)
err_sys("write error");
return 0;
}
temp文件结果如下:
aaaaabbbbbccccc
abcde
啊,lseek被O_APPEND屏蔽了?哈哈,不是被屏蔽了。原理是这样的,在每次write之前,系统都因为O_APPEND而将current offset设置为文件的末尾,这就说明了上述结果。
3.fcntl(fd,F_GETFL,0).修改文件属性。
4.dup(fd1). dup2(fd1,fd2).都返回复制后的文件描述符。与两次open得到两个文件描述符不同的是,dup2(fd1,fd2)得到的fd2与fd1共享一个file table,而前者是分别拥有一个file table。自然,用read,write在处理fd1,fd2时,就会对两者都起作用了。dup,dup2都是原子操作,而
close(fd2);
fcntl(fd1,F_DUPFD,fd2);
可以实现dup2的功能,但会破坏其原子性。