apue第三章习题的一些拙见(不定时更新)

写在前面:本人通信专业大二,自学apue,时间有限,这个系列都是抽时间写的,目前已经看到15章,现在从头做题,如有错误还请指教。

第一题:

write和read这样的函数都属于系统调用,这里具体所指的没有缓冲区是没有用户缓冲区,而不是指没有内核缓冲区,这里以我个人的认识认为,这里write和read将数据拷贝到缓冲区后并不直接写到文件中,而是等一定条件发生后才写进去,但是具体机制还需研究。同时这里也暴露了一个问题,每次进行I/O都需要进行系统调用,这无疑是对系统资源的一种浪费,所以这也为后来的标准I/O函数库的产生做了铺垫。

第二题:

先上代码:

#include "apue.h"
#include <stdio.h>
#include <fcntl.h>

int dup2_self (const int ofd , const int nfd) ;

int main () {
    int fd;
    int flag;

    fd = open ("tempfile" , O_RDWR | O_CREAT | O_TRUNC);
    flag = dup2(0 , fd);
    write (fd , "hello\n" , 6);
}

int dup2_self (const int ofd , const int nfd) {
    char *fdptr;
    int openmax = sysconf (_SC_OPEN_MAX);
    int tempfd;
    int count = 0;
    int fdarr[openmax];
    int i;

    if (ofd > openmax || nfd > openmax) {
        fprintf (stderr , "the arguement error\n");
        exit (1);
    }

    fdptr = malloc (30 * sizeof (char));
    sprintf (fdptr , "/proc/%d/fd/%d" , getpid() , ofd);
    if (access (fdptr , 0) < 0) {
        fprintf (stderr , "the ofd is not open\n");
        exit (2);
    }
    sprintf (fdptr , "/proc/%d/fd/%d" , getpid() , nfd);
    if (access (fdptr , 0) < 0) {
        fprintf (stderr , "the nfd is not open\n");
        exit (3);
    }

    if (nfd == ofd)
        return nfd;
    close (nfd);

   while (tempfd = dup (ofd)) {
        if (tempfd == nfd)
            break;
        else
            fdarr[count++] = tempfd;
    }
    printf ("%d\n" , nfd);
    for ( i = 0 ; i < count ; i++)
        close (fdarr [i]);
    return nfd;
}

这段代码显然无法做到dup2的原子性,但是在功能上至少可以实现所需要的功能,当然可靠性我也没有非常多的验证,这个最近本的实现让我弄清楚了很多问题:第一——dup2的使用规则,其实就是将文件描述符和文件描述标志的关系去掉,重新引导到另外一个文件描述标志中上。第二——dup的使用方法,它总是返回最小的可用的文件描述符值,比如在这里nfd(这里我在linux上将这个值打印出来是3)已经close后,再dup后就直接还是3,可见close掉后还是可用的文件描述符。第三——如何查看一个进程所打开的文件描述符在/proc/pid/fd/#就可以。最后结果就是我往main中的fd write的时候,它会在标准输出显示。

——————————————————————————————————————————————————分割线2016.6.1

时间: 2024-08-05 15:20:53

apue第三章习题的一些拙见(不定时更新)的相关文章

apue第四章习题的一些拙见(不定时更新)

写在前面:最近要期末考试,看来真的是要不定时更新啦XD apue4.1: 由于在这里lstat是不跟随符号文件的,而stat是跟随符号文件的,这样一来,如果使用stat,而不使用lstat那么就无法观察到符号文件.在书上4.3姐中有提到. apue4.2: 首先我在ubuntu的shell上查看原来的umask是多少,结果是0002,这里touch一个文件是不确定的,但是其他者的权限中写的权限一定是没有的.因为创建一个文件所拥有的权限不光与umask有关还与应用程序自身在创建的时候使用的参数有关

统计学习导论:基于R应用——第三章习题

第三章习题 部分证明题未给出答案 1. 表3.4中,零假设是指三种形式的广告对TV的销量没什么影响.而电视广告和收音机广告的P值小说明,原假设是错的,也就是电视广告和收音机广告均对TV的销量有影响:报纸的P值高,说明原假设成立,也就是报纸广告对TV的销量没啥影响. 2. KNN回归和KNN近分类都是典型的非参数方法.这两者的区别在于,前者的输入和输出均为定量值:而后者的输入和输入和输出均为定性值. 3. 首先,有题目可知下面关系:Y = 50 + 20(gpa) + 0.07(iq) + 35(

算法竞赛入门经典第二版第三章习题

写这个的原因是看到一位大神的习题答案总结,于是自己心血来潮也想写一个这个,目的主要是督促自己刷题吧,毕竟自己太弱了. 习题3-1 得分 UVa 1585 大致就是设置一个变量记录到当前为止的连续的O的数量,碰到X就变0,水题. #include<stdio.h> #include<ctype.h> #include<string.h> char s[90]; int main(void) { int length,n,sum,num; scanf("%d&qu

编程珠玑之第三章习题7

习题描述: 7.常见的字典允许用户查找单词的定义.习题2.1描述了允许用户查找变位词的字典.设计查找单词的正确拼写的字典和查找单词的押韵词的字典.讨论具有以下功能的字典:查找整数序列(例如:1,1,2,3,5,8,13,21-).化学结构或者歌曲韵律结构. 习题解析: 1.本题是属于脑洞大开的题,具体解答可以考虑前两个小问"设计查找单词的正确拼写的字典和查找单词的押韵词的字典." 2.对于押韵词是怎么定义的?明确了之后就可以进行解决了, 3.查找正确拼写的单词? 可以考虑如何快速找到要

具体数学第二版第三章习题(3)

31 $\left \lfloor x \right \rfloor+\left \lfloor y \right \rfloor+\left \lfloor x+y \right \rfloor=\left \lfloor x+\left \lfloor y \right \rfloor \right \rfloor+\left \lfloor x+y \right \rfloor$ (1)$\left \lfloor y \right \rfloor\leq \frac{1}{2}\left

第三章 习题

3.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { double input; double exp; scanf_s("%lf", &input); double aBefore = 1; double aNow = (aBefore + input / aBefore) / 2; exp = aBefore - aNow; e

python核心编程-第三章-习题

1.这是python的语言特性,python先创建对象,在给变量赋值时,不需要定义变量的名称和类型,它实际是用变量引用对象.变量类型在给变量赋值时自动声明 2.原因类似变量无须声明类型 3.python用下划线作为变量前缀和后缀指定特殊变量,对解释器有特殊意义,也是内建标识符所使用的特殊符号,故一般避免用下划线作为变量的开头和结尾 4.python一行可以书写多个语句,多个语句间用";"分隔.但是为了良好的编程风格,不推荐这么做 5.python可以将一个语句分成多行书写,行的末尾用反

Objective-C 程序设计(第六版)第三章习题答案

1.   不合法:6_05 (不能以数字开头) A$ ($是非法符号). 2.   myBook  (openBook,closeBook,readBook,takeBook,putBook). 3.   [myBook takeBook]; [myBook openBook]; [myBook readBook]; [myBook closeBook]; [myBook putBook]; 4.   [myBoat driver]; [myMotorcycle driver]; [myCar

具体数学第二版第三章习题(4)

46 (1)证明: 首先有$2n(n+1)=\left \lfloor 2n(n+1)+\frac{1}{2} \right \rfloor=\left \lfloor 2(n^{2}+n+\frac{1}{4}) \right \rfloor=\left \lfloor 2(n+\frac{1}{2})^{2} \right \rfloor$ 其次,令$n+\theta =(\sqrt{2}^{l}+\sqrt{2}^{l-1})m=(1+\frac{\sqrt{2}}{2})\sqrt{2}