apue第六章学习总结

1.关于阴影文件与口令

在口令文件当中,常见的字段有(以root为例):

root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户所在根目录):/bin/bash(用户的shell所在目录)

注意:这里的加密口令只是一个占位符号,真正的加密口令存于阴影文件当中,阴影口令文件不应是一般用户可以读取的。仅有少数几个程序需要存取加密口令,例如login(1)passwd(1),这些程序常常是设置用户ID为root的程序。用了阴影口令后,普通文件/etc/passwd可由各用户自由读取。

在linux下,以下代码会输出加密口令(从阴影口令文件中拉取):

#include "apue.h"
#include <shadow.h> int main(){
struct spwd *ptr;
if((ptr = getspnam("sysublackbear")) == NULL){
err_sys("getspnam error");
}
printf("sp_pwdp = %s\n", ptr->sp_pwdp == NULL || ptr->sp_pwdp[0] == 0 ? "(null)":ptr->sp_pwdp);
return 0;
}

2.编写一个程序,它调用uname并输出utsname结构中的所有字段,将该输出与uname -a命令的输出结果作比较。

本题难度并不大,注意记得函数赋值给一个指向结构体的指针时记得向内存分配一块空间,否则调用uname()函数时会失败。

代码如下:

#include "apue.h"
#include <sys/utsname.h> int main() {
struct utsname* ptr;
//在调用函数uname时先开辟一块新的空间,如果将指针设为NULL,下面函数不会运行成功,因为系统没有为其开辟内存空间
ptr = (struct utsname*)malloc(sizeof(struct utsname));
int temp;
if(temp = uname(ptr) == -1){
err_sys("uname error");
}
//写成uname -a 的形式
printf("%s %s %s %s %s\n",ptr->sysname == NULL ? "(NULL)" : ptr->sysname,
ptr->nodename == NULL ? "(NULL)" : ptr->nodename,
ptr->release == NULL ? "(NULL)" : ptr->release,
ptr->version == NULL ? "(NULL)" : ptr->version,
ptr->machine == NULL ? "(NULL)" : ptr->machine
);
return 0;
}

3.编写一个程序,获取当前时间,并使用strftime将输出结果转换为类似于date命令的默认输出。将环境变量TZ设置为不同的值,观察输出结果。

代码如下:

#include "apue.h"
#include <time.h> int main() {
time_t caltime;
struct tm *tm;
char line[MAXLINE]; //获取当前时间
if((caltime = time(NULL)) == -1){
err_sys("time error");
}
//将当前时间转换为对应的日历时间,存到tm结构体中
if((tm = localtime(&caltime)) == NULL){
err_sys("localtime error");
}
//再将日历时间打印成date的格式
if(strftime(line,MAXLINE,"%a %b %d %X %Z %Y\n",tm) == 0){
err_sys("strftime error");
}
//打印字符串(将字符数组输出到stdout流当中)
fputs(line,stdout);
return 0;
}

The End#

apue第六章学习总结的更多相关文章

  1. apue第七章学习总结

    apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...

  2. apue第四章学习总结

    apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxr ...

  3. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  4. 鸟哥的linux私房菜——第六章学习(Linux文件与目录管理)

    ******************第六章学习****************** 1.[文件与目录管理] 在所有目录下面都会存在的两个目录,分别是 "." 与 "..& ...

  5. 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

    第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...

  6. 【Java】《Java程序设计基础教程》第六章学习

    第六章 常用的工具包 6.1 java.lang包 6.1.1 Object类 Object类是一个超级类,是所有类的直接或间接父类. public boolean equals(Object obj ...

  7. 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)

    第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...

  8. 苏浪浪 201771010120《面向对象程序设计(java)》第六章学习总结

    第五章 主要学习OOP另一个部分----继承,继承使程序员可以使用现有的类,并根据需要进行修改.这是Java程序设计中的一个基础设计. 1.类.超类和子类: (1) 已有类称为:超类(supercla ...

  9. Mudo C++网络库第六章学习笔记

    muduo网络库简介 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中: 网络库的价值还在于能方便地处理并 ...

随机推荐

  1. HDU5336-XYZ and Drops-模拟

    模拟水珠那个游戏. 小水珠超过边界会消失. 会有两个水珠同时到达一个size=4大水珠的情况.要移动完统一爆炸 #include <vector> #include <cstdio& ...

  2. NetBios网络基础及编程

    开始学习(算是复习)网络编程了,第一个就是局域网的netbios协议编程. 首先了解一下什么是netbios:IBM公司为PC-Network开发的一套网络标准.,NetBIOS最广泛的应用之一就是对 ...

  3. Xamarin 的 MVVM 之 Caliburn.Micro

    约定 Caliburn.Micro 以下简称 CMXamarin.Form 以下简称 XF 摘要CM 当前已释出 3.0 beta 版https://github.com/Caliburn-Micro ...

  4. 聊聊HTTPS和SSL_TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长 ...

  5. get与post

    1. get是从服务器上获取数据,post是向服务器传送数据.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过H ...

  6. Grunt-cli的执行过程以及Grunt加载原理

    通过本篇你可以了解到: 1 grunt-cli的执行原理 2 nodeJS中模块的加载过程 Grunt-cli原理 grunt-cli其实也是Node模块,它可以帮助我们在控制台中直接运行grunt命 ...

  7. CSS3——动画效果

    CSS3动画在Style里面就实现了以往我们用JQ写的动画效果,着实简便了不少~ 简单Demo: html代码: <div id="dv1"></div> ...

  8. Moqui学习之代码分析mantle priceServices.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- This software is in the pub ...

  9. SQL中exists的使用方法

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...

  10. ASP.NET Web API实现POST报文的构造与推送

    毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法.因此研究了一下如何使用Web API或MVC构造POST报文并实现客户端与服务器端的交互. 我使用的工具是Vi ...