信息安全系统设计基础第十周

怎样学习系统编程(利用Linux学习Linux编程)


1 分析实用程序

/bin, /usr/bin, /usr/local/bin
学习使用工具,分析工具,了解功能和原理

2 学习系统调用

函数和系统调用本质上都是函数。不同的库,不同的头文件
分析需要哪些系统调用,学习系统调用的使用方法:参数?返回值?

3 编程实现

利用上面的原理和一组协同工作的系统调用,自己编程实现使用程序的功能
或积极主动抄代码,学习那些系统调用是协同工作的

如何复制文件?cp
cp能干什么?
cp src dst

如何实现cp?

open/close

open(fff, O_WRONLY|O_CREAT,0644)
creat(fff, 0644);
n = read(fd, buf, BUFSIZE);//#define BUFSIZE 4096
write(fd, buf, n);

伪代码:
打开源文件
创建目标文件
针对源文件
把源文件读入缓冲区
把缓冲区内容写入目标文件
关闭源文件和目标文件

自己编写cp:

read/write可以读取文件内容,如何读取文件名和文件属性?ls

ls能干什么?

ls
ls -l
ls -a
ls -lu:最后访问时间
ls -s:以块为单位的文件大小
ls -t:按时间排序
ls -F:显示文件类型

列出文件目录
显示文件信息
如何列出文件目录?
如何显示文件属性?
如何判断一个名字是文件还是目录?

文件树
文件和目录被组织成目录树(tree),节点是目录或者文件
目录是一种特殊文件,文件内容就是目录和文件的名字,与utmp类似
与文件不同,目录不会为空

如何实现ls?
man -k direct
man -k direct | grep -i read
man -k direct | grep -i entry

readdir
see also: opendir closedir

总结:代码模式
fopen fread/fwrite fclose
open read/write close
opendir readdir closedir

伪代码:
打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件

自己编写ls:

传入参数,显示任意目录: ls /tmp; ls /; ls /dev
分栏
.开头隐含文件:-a
排序:man -k sort

代码库:DRY
xxx_uitl.h xxx_util.c
出错处理,参数处理,常用结构...
xxx_datastru.h xxx_datastru.c
链表,双向链表
树,图。。。
xxx_algorith.h xxx_algorthm.c

ls -l能做什么?
显示文件信息:模式(文件类型file(1),访问控制),链接数,文件所有者,组,大小,最后修改时间,文件名

如何实现ls -l?
man -k file | grep -i infomation (status, property, attribute)

stat(1) stat(2)
struct stat

最后修改时间:st_mtime ctime
模式:st_mode
type ugs rwx rwx rwx

八进制掩码
struct stat info;
if ((info.st_mode & 0170000) == 0040000)
printf("这是一个目录\n");

文件类型宏

define S_ISDIR(m) (((m)&0170000)) == (0040000))

struct stat info;

if (S_ISDIR(info.st_mode))
printf("这是一个目录\n");

访问控制属性?比如说本人能不能写?如何定义宏?
S_ISREG(mod) '-'
S_ISDIR(mode) 'd'
S_ISCHR(mode) 'c'
S_ISBLK(mode)) 'b'

UID/GID 
/etc/passwd
getpwuid(3)
struct passwd

/etc/group
getgrgid(3)
struct group

自己编写ls -l: ls2.c
stat(2) struct stat
getpwuid(3) struct passwd
getgrgid(3) struct group

who

who能做什么?使用一下

man who (info who; who --help)
如何实现who?

阅读ManPages
man man

搜索ManPages
man -k
man -k XXX | grep -i YYY
阅读头文件
参阅see also

man who
man -k utmp
man 5 utmp
utmp.h
grep -i XXX -nr /usr/include

UTMP_FILE
struct utmp

define ut_name ut_user

ut_line
#define ut_time ut_tv.tv_sec

伪代码:

打开utmp文件
针对文件
读取一条记录
显示记录
关闭文件


哪些系统调用?

man -k file | grep -i read
see also

open/read/close

struct utmp s;
read( fd, &s, sizeof(s));


man 
cf fopen fread fclose

自己编写who:
read: return value
/var/run/utmp
var/run/unp、

echostate

这个代码是用来检查命令行中的提示符是否显示的,如果显示,输入的命令都可见,不显示则表示输入的命令不可见。

setecho

改变echo的状态

fileinfo

用来实现显示文件信息,建立了一个stat数据结构。
先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息,报错就用perror将报错信息打印出来。

filesize

用st_size成员来计算文件的字节数大小,先判断是否有错误,没有的话就调用。

spwd

功能是列出当前目录:

posted on 2015-11-15 21:34  20135237朱国庆  阅读(253)  评论(0编辑  收藏  举报