Linux文件I/O----APUE-chapter03练习题答案

来源:互联网 发布:淘宝客大群 编辑:程序博客网 时间:2024/05/24 05:10

因为这是我自己写的肯定会有不足甚至可能错误的地方,如有请各位阅读者指正,可以的话请您直接在博客下面留言,我方便改正.

3.1

当读/写磁盘文件时,本章中描述的函数确实是不带缓冲机制的吗?请说明原因。

实际是带有缓冲机制的,
1. 如read的时候,大多数的文件系统为改变性能都采用某种预读(read ahead)技术,
当检测到正在进行顺序读取时,系统就试图读入比应用所要求的更多数据.
2. 通常write只是将数据排入队列,而实际的写磁盘操作则可能在以后的某个时刻进行。
而数据库系统则需要使用O_SYNC,这样一来当它从write返回时就知道数据已确实写到磁盘上,
以免在系统异常是产生数据丢失

3.2

编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理

/** 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理* If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.* If  oldfd is a valid file descriptor, and newfd has the same value as oldfd, * then dup2() does nothing, and returns newfd.*/#include <unistd.h>#include <stdio.h>int mydup2(int oldfd, int newfd);int main(void){    int fd = 0;    const int newfd = 10;    fd = mydup2(1, newfd);    if (newfd == fd)        printf("mydup2 ok\n");    return 0;}int mydup2(int oldfd, int newfd){    int fd = 0;    int beginfd = 0;    int ret = -1;    int i = 0;    /* Invalid file descriptor */    if (oldfd < 0 || newfd < 0)     {        printf("oldfd and newfd must be non-negative integers\n");        goto EXIT;    }    /* newfd == oldfd, returns newfd */    if (oldfd == newfd)    {        ret = newfd;        goto EXIT;    }    /* newfd != oldfd, close newfd and assign oldfd to newfd */    close(newfd);    fd = dup(oldfd);    beginfd = fd;    while(1)    {        printf("fd=%d\n",fd);        if (newfd == fd)            break;        sleep(1);        fd = dup(oldfd);    }    /* close file descriptor that open by dup() and doesn't equal newfd */    for (i=beginfd; i!=newfd; ++i)    {        printf("i=%d\n", i);        close(i);    }    ret = newfd;EXIT:    return ret;}
0 0
原创粉丝点击