unix环境高级编程第六章习题的一些拙见

整个第六章有点乏味啊,不是那么好玩,我还是想快点到后面的章节,很好玩。

apue6.1:

使用在6.3节中介绍的getspnam函数返回的spwd结构体中的sp_pwdp字段来访问加密字段,这个字段是在/etc/shadow文件中存储的,这个函数就是访问这个文件的系统接口。现在的linux操作系统在/etc/passwd中的加密口令字段都选择了使用占位符,而不真正的将加密字段给每个用户都能查看。

apue6.2:

这个我觉得最简单的方法就是直接查看/etc/shadow文件中的字段就可以查看加密口令对应的字段。这个东西我写个代码来验证一下吧,要不然这章实在太无聊。

——————————————————————————————分割线2016.7.11

线上个代码吧

#include 
#include "apue.h"
#include 
#include 

int main () {
    struct spwd *ptr;

    while ((ptr = getspent ()) != NULL)
        if (strcmp (ptr->sp_namp , "zjf") == 0)
            break;
    printf ("%s\n" , ptr->sp_pwdp);
}

这个代码比较少,但是验证了,书上6.3节中说的函数就是/etc/shadow文件的接口,所取出来的结构体代表的内容就是文件中的内容,程序执行的结果就是文件中加密密码的结果。我在这里使用的root权限运行的,但是如果使用普通用户执行的话,是看不到这个结果的。

————————————————————————————————分割线2016.7.13

apue6.3:

这道题目送分题啊,很简单的按照书上给出的函数借口调用就可以了。

#include 
#include "apue.h"
#include 

int main () {
    struct utsname name;
    if (uname (&name) < 0)
        err_sys ("uname failed");

    printf ("sysname  is  %s\n" , name.sysname);
    printf ("nodename is  %s\n" , name.nodename);
    printf ("release  is  %s\n" , name.release);
    printf ("version  is  %s\n" , name.version);
    printf ("machine  is  %s\n" , name.machine);
}
系统自带了一个uname命令,我们也可以用这个命令来使用这些借口,最后的结果是两者之间并没有太多的区别,但是uname函数的选项要多了几个,但是输出的内容任然是一个集合。

apue6.4:

有哪个大神能提醒一下,这个题目是什么意思啊。

apue6.5:

#include 
#include 
#include 

int main () {
    time_t t;
    struct tm *tmp;
    char buf[64];

    time (&t);
    tmp = localtime (&t);

    if (strftime (buf , 64 , "%Y %m %d %A %T %Z" , tmp) == 0)
        printf ("the buf length 64 is too small\n");
    else
        printf ("%s\n" , buf);
}
这个例子和书上给出的例子没有太大的不同,只不过在输出的格式上我选在了和我所在的系统相似的格式,还有就是改变环境变量TZ之后所能得到的结果会有所不同。我做了这个实验,下面上图

unix环境高级编程第六章习题的一些拙见_第1张图片
从这里可以看出我的程序和date程序的格式基本是相同的,当我们将TZ时区改成欧洲的莫斯科的时候我们程序的输出发生了改变,看来系统函数在设计上还是极为严谨的。

——————————————————————————————————分割线2016.7.15

到此为止,第六章的更新就完成了,当然第四题希望有大牛指点。



你可能感兴趣的:(apue)