第三章习题

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

1、本章中描述的read和write函数都是系统调用,这两个函数都是在内核中进行的,所以是不带缓冲的I/O函数。而带有缓冲机制的函数是以内存空间作为缓冲区,避免不当操作降低多写性能。

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

/*************************************************************************
    > File Name: test3_2.c
    > Author: King
    > Mail: arturiapendragon_1@163.com
    > Created Time: 2017年08月05日 星期六 10时12分01秒************************************************************************/#include <apue.h>int
my_dup2(int fd, int fd2)
{
    int     t;
    int     dups[256];
    int     i = 0;    if (fd2 < 0 || fd2 > 256)
    {        printf("fd2 must more than 0 less than 256");
    }
    if (fd == fd2)
        return fd2;
    else
    {        if (close(fd2) == 0)
        {            return dup(fd);
        }
        else
        {            do
            {                t = dup(fd);
                dups[i] = t;
                i++;
            }
            while (t != fd2);            while (i)
                close(dups[--i]);
            return t;
        }
    }
}

3.3 假设一个进程执行下面3个函数调用:
fd1 = open(path, oflags);
fd2 = dup(fd1);
fd3 = open(path, oflags);
画出类似于图3-9的结果图。对fcntl作用于fd1来说,F_SETFD命令会影响哪一个文件描述符,F_SETFL呢?

(1)F_SETFD标志是文件描述符标记,只作用于一个进程的一个描述符,所以对于fctnl作用于fd1来说,只会影响fd1。
(2)F_SETFL标志是文件状态标记,作用于任何进程中的所有描述符,所以对于fctnl作用于fd1来说,会影响fd1,fd2。

3.4 许多程序都包含下面一段代码:
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2)
close(fd);
为了说明if语句的必要性,假设fd是1,画出每次调用dup2时3个描述符项及相应的文件表项的变化情况。然后再画出fd为3的情况。

标准输入、标准输出和标准错误的文件描述符都指向同一文件表项,可以使用标准输入、标准输出和标准错误的文件描述符打开该文件,并设置文件状态标记或偏移量。

3.5 在Bourne shell、Bourne-again shell 和 Korn shell中,digit1 > &digit2表示将米哦啊舒服digit1重定向至描述符digit2的同以文件。请说明下面两条命令的区别
./a.out > outfile 2>&1
./a.out > 2>&1 outfile
(提示:shell从左到右处理命令行)

(1)./a.out > outfile 2>&1
这条命令首先将标准输出重定向到outfile中,然后将标准错误文件描述符重定向到标准输出指向的文件表项中,所以标准输出和标准错误的文件描述符均指向outfile。
(2)./a.out > 2>&1 outfile
这条命令首先将标准错误文件描述符重定向到标准输出指向的文件表项中,然后标准输出文件描述符又重定向到outfile文件中。所以最后标准输出的文件描述符和标准错误的文件描述符不是指向同一个文件表项。

3.6 如果使用追加标志打开一个文件以便读、写,能否仍用lseek在任一位置开始读?能否用lseek更新文件中任一部分的数据?请编写一段程序验证

能。程序如下/***********************************************************************>  File Name: test3-6.c>  Author : Fedora>  mail: ArturiaPendragon_1@163.com>  Create Time: 2017-05-07
***********************************************************************/#include "apue.h"
#include <unistd.h>
#include <fcntl.h>int main(void)
{int fd;if((fd=open("lseek",O_RDWR | O_APPEND)) < 0){err_sys("open file error!");exit(-1);}int offt;if((offt=lseek(fd, 0, SEEK_END)) == -1){err_sys("lseek error!");exit(-1);}int wb;if((wb=write(fd,"test\n", 5)) < 0){err_sys("write error!");exit(-1);}int rb;char *rd;if((rb=read(fd,rd,wb)) < 0){err_sys("read error");exit(-1);}if(write(STDOUT_FILENO, rd, rb) != rb){err_sys("ouput result error!");exit(-1);}/*int n;char *rd;int wd;while ((n=read(fd,rd,1024)) > 0)if (write(STDOUT_FILENO,rd,wd) != wd)err_sys("write error!");if (n < 0)err_sys("write error");
*/exit(0);
}

UNIX环境高级编程习题——第三章相关推荐

  1. UNIX环境高级编程(第三版)关于apue.h的用法

    UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可 ...

  2. UNIX 环境高级编程总结——第五章 标准I/O 库

    5.1 流和 FILE 对象 对于标准 I/O 库,它们的操作则是围绕流(stream)进行的. 当打开一个流时,标准 I/O 函数 fopen 返回一个指向 FILE 对象的指针. 为了引用一个流, ...

  3. 《Unix环境高级编程》Note——第一章基础知识

    文章目录 第一章 Unix基础知识 1.引言 2.Unix体系结构 3.登录 4.文件和目录 5.输入和输出 6.程序和进程 7.出错处理 8.用户标识 9.信号 10.时间值 11.系统调用和库函数 ...

  4. Unix环境高级编程中的apue.h配置

    本文解释Unix环境高级编程的环境搭建中,apue.h如何使用安装及问题解决. 使用的是<Unix环境高级编程>第三版: 系统为CentOS 7.4,64位(Linux系统都可参考): 文 ...

  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  7. UNIX环境高级编程(第三版 源码及编译好的静态库文件)

    UNIX环境高级编程(第三版) 源码 及 库文件 链接: https://pan.baidu.com/s/1tPY17lWNDEbzkOwZaRUUNg 提取码: 1024 复制这段内容后打开百度网盘 ...

  8. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  9. 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2

    Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...

  10. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

最新文章

  1. 深入浅出CMake(一):基础篇
  2. excel求期望_商务数据分析考试:决策树分析(Excel)-安聪
  3. python测验4_python接口自动化测试四:代码发送HTTPS请求
  4. 2020.3.10.遗留问题
  5. 机器学习与气象数据_气象大数据与机器学习联合实验室 大数据和气象的“联姻”...
  6. 错误检测dP-bitstream-ei_flag runRestrictRef
  7. linux 下按内容查找文件
  8. Scrapy学习篇(三)之创建项目
  9. 函数作为参数传递至函数内部进行调用
  10. 修改Windows登陆时显示上一次登陆的用户名
  11. 新媒体营销操作手法及案例分享-初贵民
  12. 51 NOD 1407 and and and and !!
  13. 190410每日一句
  14. openGL编程指南第一章
  15. c语言dp算法解决背包问题,DP求解完全背包问题及其优化原理
  16. c语言如何输出动态数组,C语言动态数组的使用实现代码
  17. Mysql登录默认密码
  18. 【路由器无线桥接的步骤实现】水星路由器MW150R作为副路由器无线桥接TP-Link主路由器
  19. PHP 接入微信公众账号API
  20. HTML在线转换成PDF

热门文章

  1. CSDN积分获取方法
  2. 「NetSpeedMonitor」Windows10状态栏显示网络速度
  3. 科大讯飞语音识别测试
  4. c语言给定n个矩形及其长和宽,七年级数学秋季学期期末考试试题
  5. 黑马程序员java整套视频地址 javaweb+ssh+ssm视频+源码+软件
  6. xcopy和robocopy
  7. rost反剽窃检测系统_论文为什么需要进行查重检测?
  8. linux 中文输入法的安装教程,linux输入法怎么安装
  9. Plugin “GsonFormat“ is incompatible
  10. PKM2 - PKManager (基于内容的个人知识管理工具) 5M 绿色免费