⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000021.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;SuperSB&nbsp;(孤鹰),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;[转载]unix环境高级编程-附C&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Mar&nbsp;15&nbsp;14:32:37&nbsp;2000)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>发信人:&nbsp;taosm&nbsp;(128+64--&gt;cool),&nbsp;信区:&nbsp;unix&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;unix环境高级编程--附录C&nbsp;习题答案&nbsp;&nbsp;<BR>发信站:&nbsp;西十八BBS&nbsp;(Sat&nbsp;Mar&nbsp;11&nbsp;14:37:49&nbsp;2000),&nbsp;转信&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>附录C&nbsp;&nbsp;&nbsp;习题答案&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第一章&nbsp;&nbsp;<BR>1.1&nbsp;利用ls命令中的下面两个选项:-i--显示文件或目录的i节点数目(关于i节点&nbsp;&nbsp;<BR>在4.14节中会详细讨论);-d--如果参数是一目录,只列出其名字,而不是目录中&nbsp;&nbsp;<BR>的所有文件。&nbsp;&nbsp;<BR>执行下面命令的结果为:&nbsp;&nbsp;<BR>$&nbsp;ls&nbsp;-ldi&nbsp;&nbsp;&nbsp;/etc/.&nbsp;&nbsp;&nbsp;/etc/..&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3077&nbsp;drwxr-sr-x&nbsp;&nbsp;7&nbsp;bin&nbsp;&nbsp;2048&nbsp;Aug&nbsp;5&nbsp;20:12&nbsp;/etc/./&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;2&nbsp;drwxr-xr-x&nbsp;13&nbsp;root&nbsp;&nbsp;&nbsp;512&nbsp;Aug&nbsp;5&nbsp;20:11&nbsp;/etc/../&nbsp;&nbsp;<BR>$ls&nbsp;-ldi&nbsp;/.&nbsp;&nbsp;&nbsp;/..&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;2&nbsp;drwxr-xr-x&nbsp;13&nbsp;root&nbsp;&nbsp;512&nbsp;Aug&nbsp;5&nbsp;20:11&nbsp;/./&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;srwxr-xr-x&nbsp;13&nbsp;root&nbsp;&nbsp;512&nbsp;Aug&nbsp;5&nbsp;20:11&nbsp;/../&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{.和..的的i节点数均为2&nbsp;&nbsp;<BR>的i节点数均为2&nbsp;&nbsp;<BR>1.3&nbsp;假如perror的ptr参数是一个指针,则perror就可以改变ptr所指串的内容。所&nbsp;&nbsp;<BR>以利用限定词const使得perror不能修改ptr所指的串。而strerror的参数是错误号&nbsp;&nbsp;<BR>,由于其是整数类型并且C传递的是参数值,因此strerror不能修改参数的值,也&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>就没有必要使用const属性。&nbsp;&nbsp;<BR>1.4&nbsp;调用fflush,fprintf和vprintf函数会改变errno的值。如果它的值变了但没&nbsp;&nbsp;<BR>有保存,则最终显示的错误信息是不正确的。&nbsp;&nbsp;<BR>在过去开发许多程序中都可以发现不保存errno的情况,典型的打印出的错误信息&nbsp;&nbsp;<BR>是&quot;Not&nbsp;a&nbsp;typewriter.&quot;。在5.4节中标准I/O库根据标准I/O流是否指向终端设备而&nbsp;&nbsp;<BR>改变流的缓存器。istty(11.9节)通常用来判断流是否指向终端设备,如果流不指&nbsp;&nbsp;<BR>向终端设备,errno可能置为ENOTTY,从而引起该错误。程序C.1表现了这个属性。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;stdio.h&gt;&nbsp;&nbsp;<BR>/*&nbsp;&nbsp;<BR>&nbsp;*&nbsp;The&nbsp;following&nbsp;prints&nbsp;errno=25&nbsp;(ENOTTY)&nbsp;under&nbsp;4.3BSD&nbsp;and&nbsp;SVR2,&nbsp;&nbsp;<BR>&nbsp;*&nbsp;when&nbsp;stdout&nbsp;is&nbsp;redirected&nbsp;to&nbsp;a&nbsp;file.&nbsp;&nbsp;<BR>&nbsp;*&nbsp;Under&nbsp;SVR4&nbsp;and&nbsp;44BSD&nbsp;it&nbsp;works&nbsp;OK.&nbsp;&nbsp;<BR>&nbsp;*/&nbsp;&nbsp;<BR>int&nbsp;&nbsp;<BR>main()&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errno;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(fd&nbsp;=&nbsp;open(&quot;/no/such/file&quot;,&nbsp;0))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;open&nbsp;error:&nbsp;&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;errno&nbsp;=&nbsp;%d\n&quot;,&nbsp;errno);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>程序&nbsp;C.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errno和printf的交互作用&nbsp;&nbsp;<BR>执行上面的程序,结果为:&nbsp;&nbsp;<BR>$&nbsp;grep&nbsp;BSD&nbsp;/etc/motd&nbsp;&nbsp;<BR>4.3&nbsp;&nbsp;BSD&nbsp;&nbsp;UNIX&nbsp;&nbsp;#29:&nbsp;&nbsp;Thu&nbsp;Mar&nbsp;29&nbsp;&nbsp;11:14:13&nbsp;&nbsp;MST&nbsp;&nbsp;1990&nbsp;&nbsp;<BR>$&nbsp;a.out&nbsp;&nbsp;<BR>open&nbsp;error:&nbsp;&nbsp;&nbsp;error&nbsp;=&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{工作正常,stdout是一个终端}&nbsp;&nbsp;<BR>$&nbsp;a.out&nbsp;&gt;&nbsp;temp.foo&nbsp;&nbsp;<BR>$&nbsp;cat&nbsp;temp.foo&nbsp;&nbsp;<BR>open&nbsp;error:&nbsp;&nbsp;&nbsp;error&nbsp;=&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{错误}&nbsp;&nbsp;<BR>1.5&nbsp;2038年。&nbsp;&nbsp;<BR>1.6&nbsp;大约248天。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第二章&nbsp;&nbsp;<BR>2.1&nbsp;下面是4.3+BSD中使用的技术。在&lt;machine/ansi.h&gt;&nbsp;中,用大写字母定义可以&nbsp;&nbsp;<BR>在多个头文件中出现的基本数据类型。例如:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifndef&nbsp;_ANSI_--H_&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;_ANSI_H_&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;_CLOCK_T_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;_SIZE_T_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*_ANSI_H_*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下面的顺序可以在这6个头文件中分别定义size_t。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;&nbsp;_SIZE_T_&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_SIZE_T_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#undef&nbsp;&nbsp;_SIZE_T_&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样,实际上只执行一次typedef。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第三章&nbsp;&nbsp;<BR>3.1&nbsp;所有的磁盘I/O都要经过内核的块缓存器,唯一例外的是对原始磁盘设备的I/&nbsp;&nbsp;<BR>O,但是我们不考虑这种情况(Bach&nbsp;[1986]&nbsp;中的第三章讲述了这种缓存器的操作)&nbsp;&nbsp;<BR>。既然read或write的数据都要被内核缓存,那么术语&quot;无缓存装置的I/O&quot;指的是在&nbsp;&nbsp;<BR>用户的进程中对这两个函数不会自动缓存,每次read或write就要进行一次系统调&nbsp;&nbsp;<BR>用。&nbsp;&nbsp;<BR>3.3&nbsp;每次调用open函数就分配一个文件表项,如果两次打开的是相同的文件,则两&nbsp;&nbsp;<BR>个文件表项指向相同的v节点。调用dup引用已存在的文件表项(此处指fd1的文件表&nbsp;&nbsp;<BR>项),见图C.1。当F_SETFD作用于fd1时,只影响fd1的文件描述符标志;F_SETFL作&nbsp;&nbsp;<BR>用于fd1时,则影响fd1及fd2的文件描述符标志。&nbsp;&nbsp;<BR>图C.1&nbsp;open和dup的结果&nbsp;&nbsp;<BR>3.4&nbsp;如果fd是1,执行dup2(fd,1)后返回1,但是没有关闭描述符1(参见3.12节)。&nbsp;&nbsp;<BR>调用3次dup2后,3个描述符指向相同的文件表项,所以不需要关闭描述符。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果fd是3,调用3次dup2后,有4个描述符指向相同的文件表项,所以就需要关闭&nbsp;&nbsp;<BR>描述符3。&nbsp;&nbsp;<BR>3.5&nbsp;shell是从左到右处理命令行,所以&nbsp;&nbsp;<BR>a.out&nbsp;&gt;&nbsp;outfile&nbsp;2&nbsp;&gt;&amp;1&nbsp;&nbsp;<BR>首先设置标准输出到outfile,然后执行dups将标准输出复制到描述符2(标准错误&nbsp;&nbsp;<BR>)上,其结果是将标准输出和标准错误设置为相同的文件,即描述符1和2指向相同&nbsp;&nbsp;<BR>的文件表项。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而对于命令行&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.out&nbsp;2&nbsp;&gt;&nbsp;&amp;1&nbsp;&gt;outfile&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于首先执行dups,所以描述符2成为终端(假设命令是交互执行的),标准输出重&nbsp;&nbsp;<BR>定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件&nbsp;&nbsp;<BR>表项。&nbsp;&nbsp;<BR>3.6&nbsp;这种情况之下,仍然可以用lseek和read函数读文件中任何一处的内容。但是&nbsp;&nbsp;<BR>write函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从&nbsp;&nbsp;<BR>文件尾开始,不能在任意位置。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>第四章&nbsp;&nbsp;<BR>4.1&nbsp;stat函数总是顺一个符号连接向前,所以修改后的程序不会显示文件类型是&quot;&nbsp;&nbsp;<BR>符号连接&quot;。例如:/bin是/usr/bin的一个符号连接,但是stat函数的结果只显示&nbsp;&nbsp;<BR>/bin是一个目录,而不说明它是一个符号连接。若一个符号连接指向一不存在的文&nbsp;&nbsp;<BR>件,则stat出错返回。&nbsp;&nbsp;<BR>4.2&nbsp;将下面的几行语句加入&lt;ourhdr.h&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#if&nbsp;defined&nbsp;(&nbsp;S_IFLNK&nbsp;)&nbsp;&nbsp;&amp;&amp;&nbsp;&nbsp;!defined&nbsp;(&nbsp;S_ISLNK&nbsp;)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;&nbsp;S_ISLNK&nbsp;(&nbsp;mode&nbsp;)&nbsp;&nbsp;&nbsp;(((&nbsp;mode&nbsp;)&nbsp;&amp;&nbsp;S_IFMT&nbsp;)&nbsp;==&nbsp;S_IFLNK&nbsp;)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是一个我们编写的头文件如何屏蔽某些系统差别的实例。&nbsp;&nbsp;<BR>4.3&nbsp;关闭了该文件的所有存取权限。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;umask&nbsp;777&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;data&nbsp;&gt;&nbsp;temp.foo&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;ls&nbsp;-l&nbsp;temp.foo&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stevens&nbsp;29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;<BR>6:39&nbsp;&nbsp;&nbsp;temp.foo&nbsp;&nbsp;<BR>4.4&nbsp;下面的命令表示关闭用户读权限的情况。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;data&nbsp;&gt;&nbsp;foo&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;chmod&nbsp;u-r&nbsp;foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{关闭用

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -