apue第六章学习总结
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第六章学习总结的更多相关文章
- apue第七章学习总结
apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...
- apue第四章学习总结
apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxr ...
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- 鸟哥的linux私房菜——第六章学习(Linux文件与目录管理)
******************第六章学习****************** 1.[文件与目录管理] 在所有目录下面都会存在的两个目录,分别是 "." 与 "..& ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
- 【Java】《Java程序设计基础教程》第六章学习
第六章 常用的工具包 6.1 java.lang包 6.1.1 Object类 Object类是一个超级类,是所有类的直接或间接父类. public boolean equals(Object obj ...
- 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)
第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...
- 苏浪浪 201771010120《面向对象程序设计(java)》第六章学习总结
第五章 主要学习OOP另一个部分----继承,继承使程序员可以使用现有的类,并根据需要进行修改.这是Java程序设计中的一个基础设计. 1.类.超类和子类: (1) 已有类称为:超类(supercla ...
- Mudo C++网络库第六章学习笔记
muduo网络库简介 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中: 网络库的价值还在于能方便地处理并 ...
随机推荐
- LeetCode:Construct Binary Tree from Inorder and Postorder Traversal,Construct Binary Tree from Preorder and Inorder Traversal
LeetCode:Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder trav ...
- ccpc-1008-HDU5839Special Tetrahedron-计算几何
计算几何水题.暴力搞 注意力全部都在02那里,完全没想这道题! /*------------------------------------------------------------------ ...
- ASP.NET MVC 5 入门教程 (2) 控制器Controller
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC ...
- 如何构建JSON数据,JSON数据的格式,JSON数据的获取
假设你是用$.getJSON();方法获取JSON数据$.getJSON(url,{"Action":"getStudent"},function(data){ ...
- sql server 2008 基础知识
一.配置管理器 1.管理服务 使用配置管理器可以启动.停止.重新启动.继续或暂停服务. 服务器和客户端网络协议 2.SQLSMS 简介:SQLSMS是一个集成环境,用于访问.配置.管理和开发SQL ...
- Enum扩展及MVC中DropDownListFor扩展方法的使用
public enum SearchState { /// <summary> /// 全部 /// </summary> [Description("全部" ...
- 茗洋Easy UI 1.3.2 部分问题解决系列专题[Combo模糊匹配中文问题 修复]
本次给大家带来的EasyUI的我研究拓展的新特性 我使用的是 EasyUI 1.3.2版本的,项目是ASP.NET MVC3,但是本篇讲解用不上ASP.NET MVC,仅仅修改官方Demo你就知道怎 ...
- javascript继承(二)—创建对象的三种模式
一.工厂模式 function createPerson(name,age){ var o = {}; o.name = name; o.age = age; o.sayHi = function() ...
- session,cookie
Session 和cookie的学习 cookie cookie的建立 setcookie(name,value); setcookie(name,value,expiration,path,host ...
- 深入理解web项目的配置文件
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...