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

本文通过几个示例代码,展示了如何使用APUE第六章介绍的系统接口进行实际操作,包括获取用户加密口令、系统信息及当前时间等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

apue6.1:

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

apue6.2:

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

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

线上个代码吧

#include <stdio.h>
#include "apue.h"
#include <shadow.h>
#include <string.h>

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 <stdio.h>
#include "apue.h"
#include <sys/utsname.h>

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 <stdio.h>
#include <stdlib.h>
#include <time.h>

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之后所能得到的结果会有所不同。我做了这个实验,下面上图


从这里可以看出我的程序和date程序的格式基本是相同的,当我们将TZ时区改成欧洲的莫斯科的时候我们程序的输出发生了改变,看来系统函数在设计上还是极为严谨的。

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值