《Unix环境高级编程》课后习题(1-6章)

  今天有时间来做一下课后习题,下面的答案是自己的理解,有一些也参考的网上的解答,并不保证正确性。

第一章

  1. ls命令查看文件信息,-l选项以长格式的形式查看文件详细信息,-i选项打印文件的i结点编号,-d选项,表示如果文件是目录文件,则只列出该目录本身的信息,不列出该目录内文件的信息,如果文件是符号链接,则打印该链接本身的信息,不打印所指向文件的信息。在Ubuntu上进行验证:
       还在路上,稍等...
      
  2. Unix是多任务系统,执行程序时,ID为852和853的进程也在运行。

  3. strerror没必要用const,因为是赋值传递,所以不会影响原来参数的值,而perror使用的是指针,如果不加const限制,则可能影响指针所指对象的值。

  4. 调用fflush,vsprintf,fprintf等函数可能改变errno的值,如果值改变了,没有保存先前的值,则会导致输出的信息是错误的。

  5. (2^31-1)/(365*24*60*60) ≈ 68, 1970+68 = 2038年

  6. 约248天

第二章

  1. 采用宏条件编译,先在一个单独的文件定义一个宏SIZE_T表示实际类型,然后在每个头文件中加入宏条件编译:

        #ifdef _SIZE_T_
        typedef _SIZE_T_ size_t;
        #undef _SIZE_T_
        #endif

    这样可以保证实际只执行了一次typedef命令。

  2. 我使用的系统是Ubuntu14.04,系统头文件是在/usr/include/x86_64-linux-gnu/bits下的types.h,下图是里面的一部分内容:

    还在路上,稍等...

  3. 没太懂题目意思。。

第三章

  1. 没有缓冲机制,因为本章介绍的函数都是直接进行的系统调用,在函数内部不会对数据进行缓冲处理。系统每次读写磁盘数据都会经过内核的块缓存器,但这并不指的是缓冲,缓冲指的是进程内部对读写的数据做缓冲处理,是软件方面定义的而不是指硬件的缓存。

  2. 本题参考APUE习题 3.2 浅析
    dup2函数原型是int dup2(int filedes, int filedes2>,功能是复制filedes描述符,并将新描述符命名为filedes2,如果filedes2已存在,则将其关闭。不能使用fcntl,则只能想办法使用dup函数,dup每次复制的新描述符值为当前系统中最小可用描述符值,所以可以循环dup函数,直至结果等于filedes2。出错处理主要是针对filedes2,判断filedes2是否是无效的描述符(小于0或者大于系统定义的最大描述符值)。代码如下:

        #include <unistd.h>
        #include <limits.h>
        #include <stdio.h>
        #include <fcntl.h>
        #define MAX_LEN 4096
    int my_dup2(int filedes, int filedes2)
    {
        int s[MAX_LEN];
        int i=0, top=0;
        int n;
    
        if(filedes2 > sysconf (_SC_OPEN_MAX) || filedes2 < 0){
            printf("Invalid filedes2 %d\n", filedes2);
            return -1;
        }
    
        if(filedes == filedes2)
            return filedes2;
    
        while((n = dup(filedes)) < filedes2){
            if(n==-1){
                
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值