今天有时间来做一下课后习题,下面的答案是自己的理解,有一些也参考的网上的解答,并不保证正确性。
第一章
ls
命令查看文件信息,-l
选项以长格式的形式查看文件详细信息,-i
选项打印文件的i结点编号,-d
选项,表示如果文件是目录文件,则只列出该目录本身的信息,不列出该目录内文件的信息,如果文件是符号链接,则打印该链接本身的信息,不打印所指向文件的信息。在Ubuntu上进行验证:
Unix是多任务系统,执行程序时,ID为852和853的进程也在运行。
strerror没必要用const,因为是赋值传递,所以不会影响原来参数的值,而perror使用的是指针,如果不加const限制,则可能影响指针所指对象的值。
调用fflush,vsprintf,fprintf等函数可能改变errno的值,如果值改变了,没有保存先前的值,则会导致输出的信息是错误的。
(2^31-1)/(365*24*60*60) ≈ 68, 1970+68 = 2038年
约248天
第二章
采用宏条件编译,先在一个单独的文件定义一个宏SIZE_T表示实际类型,然后在每个头文件中加入宏条件编译:
#ifdef _SIZE_T_ typedef _SIZE_T_ size_t; #undef _SIZE_T_ #endif
这样可以保证实际只执行了一次typedef命令。
我使用的系统是Ubuntu14.04,系统头文件是在
/usr/include/x86_64-linux-gnu/bits
下的types.h
,下图是里面的一部分内容:没太懂题目意思。。
第三章
没有缓冲机制,因为本章介绍的函数都是直接进行的系统调用,在函数内部不会对数据进行缓冲处理。系统每次读写磁盘数据都会经过内核的块缓存器,但这并不指的是缓冲,缓冲指的是进程内部对读写的数据做缓冲处理,是软件方面定义的而不是指硬件的缓存。
本题参考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){