Unix环境高级编程第一章摘记


概述

简介
全书的描述对象:Unix下的系统调用接口标准C库提供的许多函数。相当于Unix程序员手册的第二和第三部分。
系统调用接口:操作系统给运行的程序提供的服务。

Unix标准
ANSI C,IEEE POSIX,X/Open portability guide(XPG)

全书组织


关于教程中的范例

从Richard Stevens 主页找到APUE的源码下载src.tar.gz(http://www.kohala.com/start/apue.html).
测试范例所用的系统
实践本书范例的OS有很多,包括Linux的各种商业发行版本,我选择了基于Intel 80386处理器的FreeBSD6.1(Under WinXP,Vmware Workstation + Putty)。

源码的使用方法
1)解压缩源代码
$ gunzip src.tar.gz
$ tar xvf src.tar
2)在apue.2e目录下修改Make.defines.freebsd
WKDIR=/home/dog/workspace/apue.2e
3)make
在./lib/下生成libapue.a库文件
4)execute fig1.3        ###fig1.3的功能是列出命令行参数argv[1]下的文件。
$ cp include/apue.h .
$ cp fig1.3 run.c
$ gcc run.c lib/libapue.a
$./a.out ..


CH1概览
简介
本章对以后将会碰到的概念和术语做了一个扼要的描述。从一个程序员的角度,对Unix做了一个快速浏览(a whirlwind tour)。

UNIX 结构
由内而外依次是 内核==>系统调用==>库函数和Shell==>应用程序(它也可以直接调用SC)

登录
系统口令文件/etc/passwd,格式
登录名:加密形式的密码:用户数字ID:组数字ID:说明域:主目录:shell程序
注:加密形式的密码现在都放到了其它的一个shadow文件中,如FreeBSD是在/etc/master.passwd


Shell是一个命令解释程序,接受来自终端(交互性shell)或文件(shell脚本)的命令。(Shell编程可以阅读《Unix® Shell Programming, Third Edition》)

文件和目录
statfstat查看文件的属性信息,属性信息用一个结构表示。
文件名中不能出现两个字符:null字符和/
在创建目录时,自动生成两个文件.和..。
全书的第一个例程是列出argv[1]下的所有文件名,包括子目录下的,
头文件<dirent.h> 定义了struct direntopendir()返回一个DIR结构指针,将该指针传递给readdir()返回dirent结构或者Null。closedir()
当前工作目录,主目录

输入和输出
文件描述符是内核用来标识正在被某个进程使用的文件的非负小整数(注:Unix将外设同样看作是文件)(相当于Windows编程中的handle,句柄)。
标准输入,标准输出,标准错误
非缓冲输入输出和缓冲输入输出:看buffer是系统提供还是由用户自己提供。
unistd.h POSIX标准 STDIN_FILENO,STDOUT_FILENO
read(),write(),open(),close(),lseek()
stdio.h stdin,stdout,stderr
getc(),putc(),fgets(),ferror()

程序和进程
getpid(), 取得当前进程号。(如果想通过进程名获取进程号,可以用一个自定义函数,遍历某个目录,当前的进程名都出现在里面,好像系统没有提供。)
进程控制
fork(),exec(),waitpid()
execlp(const char *cmd,char *msg...) //从PATH中查找符合参数cmd的文件名,找到后执行它。
父进程 子进程

线程和线程ID
同一进程内的所有线程共享相同的进程地址空间,文件描述符,栈以及与进程相关的属性。线程间需要同步访问共享数据以避免数据的不一致(inconsistencies)。
在进程内,线程由线程ID唯一标识。注意:线程ID只在其所在的进程内有效,到其他进程便无意义。

标准C特征
函数原型,通用指针(void*),基本系统数据类型(Primitive System Data Types)(通常定义在sys/types.h)

错误处理
系统函数调用时,往往返回一个负数表示错误,通常用errno这个变量的值表示额外的信息。
error.h定义了各种错误码,E开头。可以用man 3 errno查看。
关于errno的两条原则:
1)如果没有错误发生,其值永远不会被程序清除;
2)任何函数都不能将errno的值设为0。

相关的两个函数
char *strerror(int errnum) 
   //errnum映射到错误描述信息
void *perror(const char *msg)    //根据当前的errno值,在标准错误产生一条错误信息

错误恢复
errno.h中的错误可分为两类:致命的(fatal)非致命的(nonfatal)。对于fatal的错误,我们无能为力,所能做的就是在用户屏幕或日志文件输出一条错误信息。对于nonfatal的错误,很可能是因为暂时得不到共享资源而引起的,也就是说延迟执行可能不产生错误。

用户标志符
内核通过用户ID来检查执行操作的权限。超级用户的ID是0。如果一个进程拥有超级用户权限,那么绝大多数的文件权限检查将被略过。
用户习惯用字符串的形式表示用户和群组,但是对于系统来说,使用数字形式的ID,效率更高。两者之间的映射通过/etc/passwd这个文件。补充群组标志符supplementary group IDs ):允许一个用户最多属于16个额外群组。
getuid()getgid()

信号
信号是向进程通知某条件发生的一种技术。
进程处理信号的三种选择:
1.忽略该信号;
2.采取默认动作;
3.提供一个函数,捕捉该信号。

<signal.h>,signal(SIGXXX,fun)

Unix时间
日历事件 since 00:00:00,January 1,1970.time_t
进程时间 也叫CPU时间,是中央处理器用于进程处理的时钟数。clock_t
Unix对于每个进程维护三个时间值:
1)时钟时间,进程运行花费的总时间
2)用户CPU时间,用于执行用户指令的CPU时间
3)系统CPU时间,进程切换到内核执行的CPU时间
time命令可以输出某个进程的这三个时间值。

系统调用和库函数

小结


From 2nd Edtion

 


Unix内核结构

图中可以看出系统调用是内核的唯一对外接口,也就是说我们必须通过系统调用,才能使用内核提供的服务。在系统调用的基础上,又构建了一个通用函数库。shell是一个特殊的程序,为运行其他应用程序提供了一个接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值