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

📄 lect08-bb.ppt

📁 unix/linux 编程实践一书的所有源代码
💻 PPT
📖 第 1 页 / 共 5 页
字号:
号的用户(也称为匿名FTP)放在一个单独的目录下,利用chroot将此目录当作新的<br>
根目录就可以阻止用户访问此目录以外的文件。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chroot也用于在另一台机器上构造一文件系统层次结构的一个副本,然后修改此<br>
副本,但不更改原来的文件系统。这可用预测是新软件包装等场合。Chroot只能有<br>
超级用户使用,一旦更改了一个进程的root,该进程及其后代进程就再也不能恢复<br>
至原先的root。<br>
4.14&nbsp;首先调用stat函数取得文件的三个时间值,然后调用utime设置期望的值。我<br>
们不希望在调用utime改变的值就是stat中相应的值。<br>
4.15&nbsp;finger(1)对邮箱调用stat函数,最近一次的修改时间是上一次接收邮件的时<br>
间,最近访问时间是上一次读邮件的时间。<br>
4.16&nbsp;对cpio来说,既可以改变文件的访问时间(st_atime)和修改时间(st_mtime)<br>
也可以都不改变。cpio的-a选项可以在读文件后重新设置文件的访问时间为读文件<br>
前的时间,所以cpio可以不改变文件的访问时间。另一方面,-m选项将文件的修改<br>
时间保存为原来的修改时间。<br>
对tar来说,在抽取文件时,其缺省方式是复原归档时的修改时间,但是-m选项则<br>
将修改时间设置为抽取文件时的时间。无论tar在何种情况,文件的访问时间均是<br>
抽取文件时的时间。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于不能修改状态改变时间(utime也只能改变访问时间和修改时间),所以没有将<br>
其保存在文档上。<br>
4.17&nbsp;read改变了文件访问时间,为了消除这一影响,有些版本的file(1)调用uti<br>
me恢复文件的访问时间,但是这样做会修改文件的状态改变时间。<br>
4.18&nbsp;内核对目录的深度没有内在的限制,但是如果路径名的长度超出了PATH_MAX<br>
有许多命令会失败。程序C.2创建了一个深度为100的目录树,每一级目录名有45个<br>
字符。利用getcwd可以得到第100级目录的绝对路径名(需要多次调用realloc申请<br>
一个足够大的缓存)。<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/types.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/stat.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fcntl.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ourhdr.h"<br>
#define&nbsp;DEPTH&nbsp;&nbsp;&nbsp;100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;directory&nbsp;depth&nbsp;*/<br>
#define&nbsp;MYHOME&nbsp;&nbsp;"/home/stevens"<br>
#define&nbsp;NAME&nbsp;&nbsp;&nbsp;&nbsp;"alonglonglonglonglonglonglonglonglonglongname"<br>
int<br>
main(void)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;size;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;*path;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(chdir(MYHOME)&nbsp;&lt;&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("chdir&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;DEPTH;&nbsp;i++)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mkdir(NAME,&nbsp;DIR_MODE)&nbsp;&lt;&nbsp;0)<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;err_sys("mkdir&nbsp;failed,&nbsp;i&nbsp;=&nbsp;%d",&nbsp;i);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(chdir(NAME)&nbsp;&lt;&nbsp;0)<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;err_sys("chdir&nbsp;failed,&nbsp;i&nbsp;=&nbsp;%d",&nbsp;i);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(creat("afile",&nbsp;FILE_MODE)&nbsp;&lt;&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("creat&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;deep&nbsp;directory&nbsp;is&nbsp;created,&nbsp;with&nbsp;a&nbsp;file&nbsp;at&nbsp;the&nbsp;leaf.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Now&nbsp;let's&nbsp;try&nbsp;and&nbsp;obtain&nbsp;its&nbsp;pathname.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;=&nbsp;path_alloc(&amp;size);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;;&nbsp;;&nbsp;)&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(getcwd(path,&nbsp;size)&nbsp;!=&nbsp;NULL)<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;break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&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;err_ret("getcwd&nbsp;failed,&nbsp;size&nbsp;=&nbsp;%d",&nbsp;size);<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;size&nbsp;+=&nbsp;100;<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;if&nbsp;(&nbsp;(path&nbsp;=&nbsp;realloc(path,&nbsp;size))&nbsp;==&nbsp;NULL)<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;&nbsp;&nbsp;err_sys("realloc&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("length&nbsp;=&nbsp;%d\n%s\n",&nbsp;strlen(path),&nbsp;path);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br>
}<br>
程序C.2&nbsp;&nbsp;创建深度目录<br>
运行后得到:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;a.out<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getcwd&nbsp;failed,&nbsp;size&nbsp;=&nbsp;1025:&nbsp;Result&nbsp;too&nbsp;large<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getcwd&nbsp;failed,&nbsp;size&nbsp;=&nbsp;1125:&nbsp;Result&nbsp;too&nbsp;large<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;&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;33行}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getcwd&nbsp;failed,&nbsp;size&nbsp;=&nbsp;4525:&nbsp;Result&nbsp;too&nbsp;large<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;=&nbsp;4613<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{显示4613字节的路径名}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是由于文件名太长了,不能用tar或cpio对该目录建立档案文件,而且也不能用<br>
rm&nbsp;-r命令删除该目录。(我们怎样才能删除该目录树?)<br>
4.19&nbsp;/dev目录关闭了一般用户的写权限,所以用户不能删除目录中的文件,即un<br>
link失败。<br>
<br>
<br>
第五章<br>
5.2&nbsp;fgets函数读入数据,直到行结束或缓冲区满(当然会留出一个字节存放'\0')<br>
。同样,fputs只负责将缓冲区的内容输出,而并不考虑缓冲区中是否包含换行符<br>
。所以,如果将MAXLINE设得很小,这两个函数仍然会正常工作,只不过被执行的<br>
次数要比MAXLINE值较大的时候多。<br>
5.3&nbsp;当printf没有输出任何字符时,如:printf("")&nbsp;,返回0。<br>
5.4&nbsp;这是一个比较常见的错误。getc以及getchar的返回值是整型,而不是字符型<br>
。由于EOF经常定义为-1,那么如果系统使用的是有符号的字符类型,程序还可以<br>
正常工作。但如果使用的是无符号字符类型,那么返回的EOF被保存到字符c后将不<br>
再是-1,所以,程序会进入死循环。<br>
5.5&nbsp;5个字符长的前缀、4个字符长的进程内唯一标识再加5个字符长的系统内唯一<br>
标识(进程ID)刚好组成14位的UNIX传统文件长度限制。<br>
5.6&nbsp;使用方法为:先调用fflush后调用fsync,fsync所使用的参数由fileno函数获<br>
得。如果不调用fflush,所有的数据仍然在内存缓冲区中,此时调用fsync将没有<br>
任何效果。<br>
5.7&nbsp;当程序交互运行时,标准输入输出设备均为行缓冲方式。每次调用fgets时标<br>
准输出设备将自动刷清。<br>
<br>
<br>
第六章<br>
6.1&nbsp;在SVR4系统中,用户手册中讲述了获取阴影密码文件的函数。我们不能使用6<br>
.2节所述函数返回的pw_passwd变量来比较加密的口令。正确的方法是使用阴影密<br>
码文件中对应用户的加密口令来进行比较。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在4.3+&nbsp;BSD系统中,密码文件的阴影是自动建立的。仅当调用者的用户ID为0时,<br>
getpwnam或getpwuid函数返回的passed结构中的pw_passwd字段才包含有加密的口<br>
令。<br>
6.2&nbsp;在SVR4系统中,程序C.3将输出加密的口令。当然,除非有超级用户权限,否<br>
则调用getspnam将返回EACCESS错误。<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/types.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;shadow.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ourhdr.h"<br>
int<br>
main(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SVR4&nbsp;version&nbsp;*/<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;spwd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(ptr&nbsp;=&nbsp;getspnam("stevens"))&nbsp;==&nbsp;NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("getspnam&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("sp_pwdp&nbsp;=&nbsp;%s\n",<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;&nbsp;&nbsp;ptr-&gt;sp_pwdp&nbsp;==&nbsp;NULL&nbsp;||&nbsp;ptr-&gt;sp_pwdp[0]&nbsp;==&nbsp;0&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;&nbsp;&nbsp;"(null)"&nbsp;:&nbsp;ptr-&gt;sp_pwdp);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br>
}<br>
程序C.3&nbsp;&nbsp;在SVR4系统中输出加密的口令<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在4.3+&nbsp;BSD系统中,具有超级用户权限时,程序C.4将输出加密的口令。否则pw_<br>
passed的返回值为星号(*)。<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/types.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pwd.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ourhdr.h"<br>
int<br>
main(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;44BSD&nbsp;version&nbsp;*/<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;passwd&nbsp;&nbsp;&nbsp;*ptr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(ptr&nbsp;=&nbsp;getpwnam("stevens"))&nbsp;==&nbsp;NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("getpwnam&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pw_passwd&nbsp;=&nbsp;%s\n",<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;&nbsp;&nbsp;ptr-&gt;pw_passwd&nbsp;==&nbsp;NULL&nbsp;||&nbsp;ptr-&gt;pw_passwd[0]&nbsp;==&nbsp;0<br>
<br>
?<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;&nbsp;&nbsp;"(null)"&nbsp;:&nbsp;ptr-&gt;pw_passwd);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br>
}<br>
程序C.4&nbsp;&nbsp;在4.3+&nbsp;BSD系统中输出加密的口令<br>
6.4<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;time.h&gt;<br>
#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ourhdr.h"<br>
int<br>
main(void)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;caltime;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;tm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*tm;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line[MAXLINE];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(caltime&nbsp;=&nbsp;time(NULL))&nbsp;==&nbsp;-1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("time&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(tm&nbsp;=&nbsp;localtime(&amp;caltime))&nbsp;==&nbsp;NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("localtime&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strftime(line,&nbsp;MAXLINE,&nbsp;"%a&nbsp;%b&nbsp;%d&nbsp;%X&nbsp;%Z&nbsp;%Y\n",&nbsp;tm)&nbsp;==&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("strftime&nbsp;error");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fputs(line,&nbsp;stdout);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br>
}<br>
程序C.5&nbsp;&nbsp;以date(1)的格式输出日期和时间<br>
程序C.5的运行结果如下:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;echo&nbsp;$TZ<br>
MST7<br>
$&nbsp;a.out<br>
Wed&nbsp;Jan&nbsp;15&nbsp;06:48:57&nbsp;MST&nbsp;1992<br>
$&nbsp;TZ=EST5EDT&nbsp;a.out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U.S.East&nbsp;Coast<br>
Wed&nbsp;Jan&nbsp;15&nbsp;08:49:06&nbsp;EST&nbsp;1992<br>
$&nbsp;TZ=JST-9&nbsp;a.out&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;Japan<br>
Wed&nbsp;Jan&nbsp;15&nbsp;22:49:12&nbsp;JST&nbsp;1992<br>
<br>
<br>
第七章<br>
7.1&nbsp;原因在于printf的返回值(输出的字符数)变成了main函数的返回码。当然,并<br>
不是所有的系统都会出现该情况。<br>
7.2&nbsp;当程序处于交互运行方式时,标准输出设备通常处于行缓冲方式,所以当键入<br>
新行符时,上次的结果才被真正输出。如果标准输出设备被定向到一个文件而处于<br>
完全缓冲方式,则当标准I/O清理操作执行时,结果才真正被输出。<br>
7.3&nbsp;由于agrc和argv不象environ一样保存在全局变量中,所以在大多数Unix系统<br>
中没有其它办法。<br>
7.4&nbsp;当C程序复引用一个空指针出错时,执行该程序的进程将终止,于是可以利用<br>
这种方法终止进程。<br>
7.5&nbsp;定义如下:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;Exitfunc&nbsp;(&nbsp;void&nbsp;)&nbsp;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;atexit&nbsp;(&nbsp;Exitfunc&nbsp;*func&nbsp;)&nbsp;;<br>
7.6&nbsp;calloc将分配的内存空间初始化为0。但是ANSI&nbsp;C并不保证0值与浮点0或空指<br>
针的值相同。<br>
7.7&nbsp;只有通过exec函数执行一个程序时,才会分配堆和堆栈。<br>
7.8&nbsp;可执行文件包含了用于调试core文件的符号表信息,用strip(1)可以删除这些<br>
信息,对两个a.out文件执行这条命令,它们的大小减为98304和16384。<br>
7.9&nbsp;没有使用共享库时,可执行文件的大部分都被标准I/O库所占用。<br>
7.10&nbsp;这段代码不正确。因为在if语句中定义了自动变量val,所以当if中的复合语<br>
句结束时,该变量就不存在了,但是在if语句之外又用指针引用已经不存在的自动<br>
变量val。<br>
第七章<br>
7.1&nbsp;原因在于printf的返回值(输出的字符数)变成了main函数的返回码。当然,并<br>
不是所有的系统都会出现该情况。<br>
7.2&nbsp;当程序处于交互运行方式时,标准输出设备通常处于行缓冲方式,所以当键入<br>
新行符时,上次的结果才

⌨️ 快捷键说明

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