UNIX系统编程小结(一)(2)

当利用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的功能,但会破坏其原子性。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5dca6e4955b24164b69c938efaec54ac.html