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

本文探讨了Linux文件I/O的缓冲机制,解释了read和write函数在磁盘操作中的缓冲行为,如预读和延迟写。同时,提供了一个与APUE 3.12节dup2函数功能相同但不依赖fcntl的实现,旨在确保正确处理错误情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值