UNIX环境高级编程习题——第三章

2023-05-16

第三章习题

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UNIX环境高级编程习题——第三章 的相关文章

随机推荐

  • 错误: 程序包org.apache.log4j不存在问题处理

    将maven中依赖修改如下 xff1a lt dependency gt lt groupId gt log4j lt groupId gt lt artifactId gt log4j lt artifactId gt lt versio
  • 构建maven项目失败解决办法

    通过eclipse的maven插件新建maven项目时 xff0c 出现如下错误 Unable to create project from archetype org apache maven archetypes maven arche
  • 关于java中的非静态代码块和静态代码块

    非静态代码块如 xff1a System out println 34 2 34 以上代码块就是非静态的代码块 xff0c 请注意这里的方法名 作用域 返回值 参数一概没有 xff0c 非静态代码块会在每次类被调用或者被实例化时就会被执行
  • jsoninclude.include.non_null 不起作用问题

    在开发过程中 xff0c 遇到在属性上加jsoninclude include non null注解 xff0c 有些属性起了作用 xff0c 有些却没有起作用 xff0c 下面使用代码简要说明一下 xff1a 64 Data public
  • 再次认识java的序列化

    首先是我们为什么要序列化 xff1f 我们可以来想想游戏的场景 xff0c 一个游戏有很多关卡 xff0c 并不是一次性能够打完的 如果我们打完一关 xff0c 这时候需要退出游戏休息了 当我们再次进入游戏之后发现这个游戏竟然需要重新打起
  • 控制actionbar中的向上键

    android中会给配置了 android parentActivityName 的activity默认加入一个向上返回键 xff0c 如下 xff1a 当点击向上返回后 xff0c 默认的行为是finish自身 xff0c startac
  • Android Studio快捷键

    Alt 43 回车 导入包 自动修正 Ctrl 43 N 查找类 Ctrl 43 Shift 43 N 查找文件 Ctrl 43 Alt 43 L 格式化代码 Ctrl 43 Alt 43 O 优化导入的类和包 Alt 43 Insert
  • Ubuntu 16.04 出现E: Problem executing scripts E: Sub-process returned an error code处理办法

    E Problem executing scripts APT Update Post Invoke Success 39 if usr bin test w var cache app info a e usr bin appstream
  • android studio “leaked window“ 错误

    昨天玩我做的app 发现app运行没问题 xff0c 但log里面出现下面的错误 xff1a Activity com example thirdversionclock MainActivity welcome has leaked wi
  • Archlinux 安装桌面环境 dwm + polybar

    Archlinux 安装桌面环境 dwm 43 polybar 关于git一 安装一些必要软件1 壁纸 状态栏等软件2 安装dwm和st 三 安装Polybar四 Fish Shell五 登录管理器六 一些个人使用的工具 2023 1 31
  • Arch Linux 安装和配置(陆续更新)

    Arch Linux 安装和配置 陆续更新 南国一年一度的回南天到来 xff0c 周末百无聊赖 xff0c 研究一下Arch Linux xff0c 整理此文 xff0c 其他使用笔记陆续补充 一 在Vmware中安装Arch Linux
  • ASP.NET Core MemoryCache 缓存

    ASP NET Core 中的缓存内存 xff08 MemoryCache xff09 ASP NET Core 中的缓存内存 ASP NET Core 中的分布式缓存 xff08 SQL Server 和 Redis 分布式缓存 xff0
  • FFmpeg In Android - 多媒体文件解封装/解码/保存Yuv

    FFMPEG视音频编解码零基础学习方法 100行代码实现最简单的基于FFMPEG 43 SDL的视频播放器 本文例子的源码 demuxing decoding cpp 修改自源码自带的例子ffmpeg源码 doc example demux
  • 【Java篇】多线程详解

    Java 多线程基础详解 文章目录 Java 多线程基础详解线程的相关概念一 创建线程的几种方式1 继承Thread类2 实现Runnable接口3 实现Callable接口4 推荐使用Runnable接口 二 线程安全1 线程安全问题引入
  • NotePad++ XMLTools 插件离线安装

    在使用NotePad 43 43 时 xff0c 在某些情形下 xff0c 需要格式化Xml格式内容 xff0c 可以使用Xml Tools插件 xff0c 注意下载安装包时 xff0c 需下载与NotePad 43 43 像匹配版本的插件
  • 【Windows逆向】【Qt】日志信息打印

    目录 x1f6eb 导读需求开发环境 1 示例程序Demo2 编写功能 xff08 QtCreator版本 xff09 3 编写功能 xff08 VS版本 xff09 x1f6ec 文章小结 x1f4d6 参考资料 x1f6eb 导读 需求
  • Ubuntu 18.04 安装ROS melodic文件错误问题broken packages

    反复多次尝试安装ros melodic xff0c 一直报错 xff0c 有文件损坏或者安装依赖问题 直接进入安装阶段 xff0c 前面的请看其他详细帖子 sudo apt span class token operator span ge
  • 在虚拟机安装Archlinux

    最近花了挺长一段时间练习在虚拟机安装archlinux的 xff0c 在这里跟大家分享一下经验 xff0c 如有错误 xff0c 欢迎大家指出 xff0c 谢谢大家 准备工作 archlinux镜像 43 vmware workstatio
  • Linux系统启动流程及系统裁剪

    一 内核管理简要理论 1 内核的功能 xff08 1 xff09 进程管理 xff08 2 xff09 内存管理 xff08 内核管理代码中代码量最大的部分 xff09 xff08 3 xff09 I O管理 xff1a 中断及中断处理 x
  • UNIX环境高级编程习题——第三章

    第三章习题 3 1 当读 写磁盘文件时 xff0c 本章中描述的函数确实是不带缓冲机制的吗 xff1f 请说明原因 xff1a span class hljs number 1 span 本章中描述的read和write函数都是系统调用 x