《UNIX环境高级编程》--6系统数据文件和信息

来源:本网整理

我们用这本书当教材的。。教授一直强调去学 man page的大多都讲得挺透彻的,包括用法结构

系统数据文件和信息

用户配置文件

1. /etc/passwd

  1. UNIX口令文件 /etc/passwd/是一个ASCII文件,每一行包含很多字段,字段之间用冒号分隔。这些字段包含在<pwd.h>头文件定义的passwd,该结构有如下成员:

    • char *pw_name:用户名
    • char *pw_passwd:加密口令
    • uid_t pw_uid:数值用户ID
    • gid_t pw_gid:数值组ID
    • char *pw_gecos:注释字段
    • char *pw_dir:初始工作目录
    • char *pw_shell:初始shell
    • char *pw_class:用户访问类
    • time_t pw_change:下次更改口令时间
    • time_t pw_expire:账户有效期时间

    看完你只能写些简单的命令,或者程序。实际项目中要复杂得多,需要实践

    关于口令文件:

    • 通常有一个用户名为root的登录项,其用户ID是 0
    • 加密口令字段包含一个占位符。现在加密口令其实是放在/etc/shadow
    • 口令文件中某些字段可能为空。

      每章都是平时工作中可能用到的内容,很难说谁重要谁不重要,我一般是把这本书当成参考书用的,实际编程中有

      • 如果加密口令字段为空,则说明该用户没有口令,没有口令则不能登录
    • shell字段指定了初始shell

      未定义。。。。http://blog.csdn.net/xuorui/article/detail

      • 若它为空,则取系统默认值(通常是/bin/sh)linux下为/bin/bash
      • 若它为/dev/null,则会阻止任何人以该字段所在行记录中的用户名来登录系统
    • 用户名如果是nobody,则任何人都可以使用它登录系统,但是其用户ID和组ID不提供任何特权。该用户ID和组ID只能访问人人皆可读、可写的文件
    • Linux中,没有 pw_class,pw_change,pw_expire字段

注意如果要将一个用户设为不能登录

这本书只用到C.至于看不看得懂,下载个电子版看看不就得了,不要跟我说你不知道怎么找电子书。百度搜

1.可以将其shell设为/bin/false/bin/true

用了这么久Mate9,忍不住评价下,因为华为能有好成绩,真正是靠产品说话,抓住了用户真正痛点需求,并且很好解决了:1.华为在基带方面的积累让华为手机信号真的很好。2.持续流畅性方面,各种APP层出不穷,安卓系统解决了开放问题,确带来了长期使用卡顿问题,这个痛点的解决牵涉到操作系统的文件系统和CPU等各方面,超出单个上游厂商如高通、安卓等能力范畴,留给了华为创新机会。3.另外安全方面,手机变成了支付终端,个人信息携带终端,政企精英对安全,隐私很重视,华为迅速占领了这部分市场。随着移动支付普及,大家安全意识的上升,华为这块优势更加凸现。4.摄像,华为和徕卡合作,结合物理和数学算法各自优势,很好解决

2.可以在/etc/shadow下将密码字段前加!!*

  1. 加拿大小天王贾斯汀·比伯(JustinBieber)14岁时已经出道,2009年发行了第一张个人专辑《MyWorld》,2010年更是以一首《Baby》迅速红遍全球。外表帅气的比伯从出道以来,他的一言一行就备受关注,爆红的他从发型到搭配都成为年轻人争相模仿的对象。尤其比伯的发型,从2009年出道至今几乎每年都换新花样,展现出比伯不一样的气质,今天就一起来回顾一下比伯的发型发展史吧!2009年,刚出道时,15岁的比伯以一头服贴的发型,配上高颜值的外表,吸引了大家的注意。2010年的比伯,继续维持着这个发型。▼15岁的比伯,当时还是外表俊朗的小鲜肉到了2011年,这个发型起了些许变化,以前的发型稍

    getpwuid/getpwnam函数:读取口令文件:

    还是比较中意华为,小米的营销动作真的越来越花哨了。两者的商业模式不一样,一个追求硬件利润,一个做价格厚道感动人心的产品,追求用户数量,靠互联网思维赚钱,本质上都是赚钱为目的。但是区别是小米手机一直定位性价比,给人一种屌丝机的印象,华为从杨柘负责营销之后,把华为品牌形象由工科男直接拉升到文艺范,成功建立了高端形象,加上商务设计和渠道返利的加持,以及华为手机不低的品质,所以收割了一大片粉丝。从小米6定价2499到小米亮银版拍出近10万的天价,就可以知道小米想要冲击高端机的野心,在目前国人的思维模式下,估计不会很受待见。毕竟当时小米在市场上杀出一条血路靠得就是性价比三个字啊,而且越来越多的冠名活动,

    #include<pwd.h> struct passwd* getpwuid(uid_t uid); struct passwd* getpwnam(const char*name);

    • 参数:

      曾经看到过无数的叫停,因为老人在最后的时候还疾病缠身,结果花光了家里所有的积蓄,然后自己的家庭和自己的亲人也要跟着自己在担惊受怕。但是有没有人能想过当事人的感受呢,自己的生命走到尽头,因为自己承受不了自己的孱弱,自己承受不了痛苦希望能在最后用一种有最严的方式离开,不让自己承受那种因为自己的身体带来的没有最严的生活,因为自己可以在另外一个地方安静地生活,即使那个地方已经是天国了。但是有多少人能真正的理解当事人的心愿呢?即使为了自己的良知,我们也不愿意让生命结束,因为我们可能就是舍不得亲人去世,舍不得因为自己的一念之差让自己的亲人离开,因为我们觉得自己会后悔,但是我们有没有想过,我们这样做是为了什

      • uid:用户ID
      • name:用户名
    • 返回值:

      • 成功:返回passwd结构的指针
      • 失败:返回NULL

    注意:getpwuid/getpwnam函数返回的 struct passwd结构通常是函数内部的静态变量,因此多次调用上面的函数,该静态变量会被覆写。

  2. 查看整个口令文件,使用下面的函数:

    #include<pwd.h> struct passwd *getpwent(void); void setpwent(void); void endpwent(void);

    • getpwent返回值:

      • 成功:返回passwd结构的指针
      • 失败:返回NULL
      • 到达文件尾端:返回NULL

    用法:

    • 调用getpwent时,它返回口令文件中的下一个记录项

    返回的 struct passwd结构通常是函数内部的静态变量,因此多次调用getpwent函数,该静态变量会被覆写

  3. 在第一次调用getpwent函数时,它会打开所使用的各个文件
  4. getpwent对返回的各个记录项顺序并没有要求
  5. setpwent会反绕getpwent所使用的文件到文件起始处。即当调用setpwent之后,getpwent又会从头开始读取记录项
  6. endpwent会关闭getpwent所使用的文件。在调用getpwent读取完口令文件后,一定要调用endpwent关闭这些文件

    getpwent知道什么时候应该打开它所使用的文件(第一次被调用时),但是不知道何时应该关闭这些文件

  7. 加密口令是经单向加密算法处理过的用户口令副本。

    因为此算法是单向的,所以不能从加密口令猜测到原始口令

    现在的UNIX将加密口令存放在一个称作阴影口令的文件中(即文件/etc/shadow)。该文件至少应该包含用户名和加密口令。这些字段包含在<shadow.h>头文件的struct spwd结构中。相关的字段如下:

    • char *sp_namp:用户登录名
    • char *sp_pwdp:加密口令
    • int sp_lstchg:上次更改口令以来经过的时间
    • int sp_min:经过多少天后允许修改口令
    • int sp_max:经过多少天后必须修改口令
    • int sp_warn:经过多少天后如果未修改口令则系统发出警告
    • int sp_inact:经过多少天后,该账户是inactive
    • int sp_expire:经过多少天后,该账户过期
    • unsigned int sp_flag:保留字段

    其中只有用户登录名和加密口令这两个字段是必须的。其他字段都是用于控制口令更改的频率。

    注意:

    • 阴影口令文件/etc/shadow 不应该由一般用户读取。

      • 仅有少数几个程序需要访问加密口令,如login,passwd。这些程序通常是设置用户ID为root的程序
      • 普通口令文件/etc/passwd/可以任由各用户读取
  8. 用于读取阴影口令文件的函数为:

    #include<shadow.h> struct spwd *getspnam(const char*name); struct spwd *getspent(void); void setspent(void); void endspent(void);

    • getspnam参数:

      • name:用户名
    • getspnam返回值:

      • 成功:返回spwd结构指针
      • 失败:返回NULL
    • getspent返回值:

      • 成功:返回spwd结构指针
      • 失败:返回NULL
      • 到达文件尾端:返回NULL

    用法:

    • 调用 getspnam时,它返回阴影口令文件中,对应用户名的那一条记录项

    返回的 struct spwd结构通常是函数内部的静态变量,因此多次调用getspnam函数,该静态变量会被覆写

  9. 调用getspent时,它返回阴影口令文件中的下一个记录项

    返回的 struct spwd结构通常是函数内部的静态变量,因此多次调用getspent函数,该静态变量会被覆写

  10. 在第一次调用getspent函数时,它会打开所使用的各个文件
  11. getspent对返回的各个记录项顺序并没有要求
  12. setspent会反绕getspent所使用的文件到文件起始处。即当调用setspent之后,getspent又会从头开始读取记录项
  13. endspent会关闭getspent所使用的文件。在调用getspent读取完阴影口令文件后,一定要调用endspent关闭这些文件

    getspent知道什么时候应该打开它所使用的文件(第一次被调用时),但是不知道何时应该关闭这些文件

  14. UNIX 组文件包含的字段定义在<grp.h>所定义的group结构中:

    • char *gr_name:组名
    • char *gr_passwd:加密口令
    • int gr_gid:组ID
    • char **gr_mem:指向各用户名指针的数组

    它是一个指针数组,其中每个指针指向一个属于该组的用户名。该数组以null指针结尾

  15. struct_group

  16. getgrgid/getgrnam函数:查看组文件:

    #include<grp.h> struct group* getgrgid(gid_t gid); struct group* getgrnam(const char* name);

    • 参数:

      • gid:组ID
      • name:组名
    • 返回值:

      • 成功:返回group结构的指针
      • 失败:返回NULL

    注意:getgrgid/getgrnam函数返回的 struct group结构通常是函数内部的静态变量,因此多次调用上面的函数,该静态变量会被覆写。

  17. 查看整个组文件,使用下面的函数:

    #include<grp.h> struct group *getgrent(void); void setgrent(void); void endgrent(void);

    • getgrent返回值:

      • 成功:返回group结构的指针
      • 失败:返回NULL
      • 到达文件尾端:返回NULL

    用法:

    • 调用getgrent时,它返回组文件中的下一个记录项

    返回的 struct group结构通常是函数内部的静态变量,因此多次调用getgrent函数,该静态变量会被覆写

  18. 在第一次调用getgrent函数时,它会打开所使用的各个文件
  19. getgrent对返回的各个记录项顺序并没有要求
  20. setgrent会反绕getgrent所使用的文件到文件起始处。即当调用setgrent之后,getgrent又会从头开始读取记录项
  21. endgrent会关闭getgrent所使用的文件。在调用getgrent读取完组文件后,一定要调用endgrent关闭这些文件

    getgrent知道什么时候应该打开它所使用的文件(第一次被调用时),但是不知道何时应该关闭这些文件

  22. UNIX中还提供了附属组ID。其中获取和设置附属组ID的函数为:

    #include<unistd.h> int getgroups(int gidsetsize,gid_t grouplist[]); #include<grp.h> //对Linux #include<unistd.h> //对 FreeBSD, Mac OS X, Solaris int setgroups(int ngroups,const gid_t grouplist[]); #include<grp.h> //对Linux #include<unistd.h> //对 FreeBSD, Mac OS X, Solaris int initgroups(const char *username, gid_t basegid);

    参数:

    • 对于getgroups函数:

      • gidsetsize:填入grouplist数组的附属组ID的最大数量

        若该值为0,则函数只返回附属组ID数,而不修改grouplist数组

      • grouplist:存放附属组ID的数组
    • 对于setgroups函数:

      • ngroupsgrouplist数组中元素个数

        数量不能太大,不能超过NGROUPS_MAX

      • grouplist:待设置的附属组ID的数组
    • 对于initgroups函数:

      • username:用户名
      • basegid:用户的base组ID(它就是在口令文件中,用户名对于的组ID)

    返回值:

    • 对于getgroups函数:

      • 成功:返回附属组ID的数量
      • 失败:返回 -1
    • 对于setgroups/initgroups函数:

      • 成功:返回 0
      • 失败:返回 -1

    用法:

    • getgroups函数将进程所属用户的各附属组ID填写到grouplist中,填入该数组的附属组ID数最多为gidsetsize个。实际填写到数组中的附属组ID数由函数返回
    • setgroups函数可由超级用户调用以便为调用进程设置附属组ID表。
    • 由于initgroups函数会在内部调用setgroups函数,因此它也必须由超级用户调用
  23. 除了口令文件和组文件之外,系统中还有很多其他重要的数据文件。UNIX对于这些系统数据文件提供了对应的类似的API。对于每种数据文件,至少有三个函数:

    • get函数:读下一个记录。如果需要还会打开该文件。

      • 此种函数通常返回一个指向某个结构的指针。
      • 当已到达文件尾端时,返回空指针
      • 大多数get函数返回指向一个静态存储类结构的指针,如果需要保存其内容,则需要复制该结构
    • set函数:打开相应数据文件(如果尚未打开),然后反绕该文件

      • 如果希望在相应文件起始处开始处理,则调用该函数
    • end函数:关闭相应数据文件。在结束了对相应数据文件的读、写操作后,总应该调用此函数以关闭所有相关文件

    另外如果数据文件支持某种形式的键搜索,则也提供搜索具有指定键的记录的函数

    下面是各个重要的数据文件:

    说明 数据文件 头文件 结构 附加的键搜索函数
    口令 /etc/passwd passwd getpwnam,getpwuid
    /etc/group group getgrnam,getgrgid
    阴影 /etc/shadow

时间和日期

  1. UNIX内核提供的基本时间服务是自 UTC 1970-01-01 00:00:00 这一特定时间以来经过的秒数。

    • 这个时间称作日历时间,用数据类型 time_t 表示(它包括了时间和日期)
    • UNIX 提供若干个时间函数来转换日历时间
  2. time函数:返回当前的日历时间

    #include<time.h> time_t time(time_t *calptr);

    • 参数:

      • calptr:如果该指针不是NULL,则返回的日历时间也存放在calptr指向的内存中
    • 返回值:

      • 成功:返回当前日历时间的值
      • 失败:返回 -1
  3. clock_gettime函数:用于获取指定的时钟类型的时间:

    #include<sys/time.h> int clock_gettime(clockid_t clock_id,struct timespec *tsp);

    • 参数:

      • clock_id:时钟类型。

        • CLOCK_REALTIME:获取实时系统时间。此时clock_gettime函数提供了与time函数类似的功能。不过在系统支持高精度时间值的情况下,clock_gettime可能比time函数得到更高精度的时间值。
        • CLOCK_MONOTONIC:获取不带负跳数的实时系统时间
        • CLOCK_PROCESS_CPUTIME_ID:调用进程的CPU时间
        • CLOCK_THREAD_CPUTIME_ID:调用线程的CPU时间
      • tsp:存放获取时间的timespec结构(它把时间表示为秒和纳秒)的指针
    • 返回值:

      • 成功: 返回 0
      • 失败: 返回 -1
  4. clock_getres函数:时间精度调整

    #include<sys/time.h> int clock_getres(clockid_t clock_id,struct timespec *tsp);

    • 参数:

      • clock_id:时钟类型。
      • tsp:存放时间的timespec结构(它把时间表示为秒和纳秒)的指针
    • 返回值:

      • 成功: 返回 0
      • 失败: 返回 -1

    clock_getres函数把参数tsp指向的timespec结构初始化为与clock_id参数对应的始终精度

  5. clock_settime函数:设置时间

    #include<sys/time.h> int clock_settime(clockid_t clock_id,const struct timepsec *tsp);

    • 参数:

      • clock_id:时钟类型。
      • tsp:存放时间的timespec结构(它把时间表示为秒和纳秒)的指针
    • 返回值:

      • 成功: 返回 0
      • 失败: 返回 -1

    clock_settime函数对特定的时钟设置时间。但是:

    • 某些始终是不能修改的
    • 需要适当的权限来修改时钟值
  6. gettimeofday函数:更高精度的获取当前时间(但是目前已经弃用)

    #include<sys/time.h> int gettimeofday(struct timeval *restrict tp,void *restrict tzp);

    • 参数:

      • tp:存放当前时间的timeval结构(将当前时间表示为秒和微秒)的指针
      • tzp:唯一合法值是NULL。其他任何值都产生未定义的结果
    • 返回值:总是返回 0
  7. gmtime/localtime函数:将日历时间转换成struct tm结构:

    #include<time.h> struct tm* gmtime(const time_t *calptr); struct tm* localtime(const time_t *calptr);

    • 参数:calptr:指向日历时间的指针
    • 返回值:

      • 成功:指向struct tm结构的指针
      • 失败:返回NULL

    struct tm{ int tm_sec; //秒数,范围是 [0~60] int tm_min; //分钟数,范围是 [0~59] int tm_hour; //小时数,范围是 [0~23]。午夜12点是 0 int tm_mday; //一个月中的天数,范围是 [1~31] int tm_mon; //月数,范围是 [0~11] ,一月是 0 int tm_year; //年数,范围是 [1900~],如果是16则表示 1916 int tm_wday; //一个星期中的天数,范围是 [0~6] ,周日是0 int tm_yday; //一年中的天数,范围是 [0~365],一月一号是 0 int tm_isdst; //daylight saving time flag }

    其中秒可以超过 59 的理由是表示润秒

    gmtime/localtime函数的区别:

    • gmtime:将日历时间转换成统一协调的年月日时分秒周日分解结构
    • localtime:将日历时间转换成本地实际(考虑本地市区和夏令时标志),由TZ环境变量指定

    TZ环境变量影响localtime/mktime/strftime这三个函数:

    • 如果定义了TZ环境变量:则这些函数将使用TZ的值代替系统默认时区

    • 如果TZ定位为空TZ=,则使用UTC作为时区
  8. mktime函数:以本地时间的年月日等作为参数,将其变化成time_t值:

    #include<time.h> time_t mktime(struct tm*tmptr);

    • 参数: tmptr:指向struct tm结构的指针
    • 返回值:

      • 成功: 返回日历时间
      • 失败: 返回 -1

    所谓的本地实际的”本地“:由 TZ环境变量指定

  9. strftime/strftime_l函数:类似printf的打印时间的函数。它们可以通过可用的多个参数来定制产生的字符串

    #include<time.h> size_t strftime(char *restrict buf,size_t maxsize,const char*restrict format, const struct tm* restrict tmptr); size_t strftime_l(char *restrict buf,size_t maxsize,const char*restrict format, const struct tm* restrict tmptr,locale_t locale);

    • 参数:

      • buf:存放格式化后的时间字符串的缓冲区的地址
      • maxsize:存放格式化后的时间字符串的缓冲区的大小
      • format:时间的格式化字符串
      • tmptr:存放时间的struct tm结构的指针

      对于strftime_l 函数:

      • locale:指定的区域
    • 返回值:

      • 成功:返回存入buf的字符数
      • 失败: 返回 0

    注意:

    • 如果buf长度足够存放格式化结果以及一个null终止符,则这两个函数才有可能顺利转换;否则空间不够,这两个函数返回0,表示转换失败
    • strftime_l运行调用者将区域指定为参数;而strftime使用通过TZ环境变量指定的区域
    • format参数控制时间值的格式。如同printf,转换说明的形式是百分号之后跟随一个特定的字符,而format中的其他字符则按照原样输出:

      • %a:缩写的周日名,如Thu
      • %A:周日名,如Thursday
      • %b:缩写的月名:如Jan
      • %B:全月名,如January
      • %c:日期和时间,如Thu Jan 19 21:24:25 2012
      • %C:年的最后两位,范围是(00~99),如20
      • %d:月日,范围是 (01~31),如19
      • %D日期(MM/DD/YY),如01/19/12
      • %e月日(一位数字前加空格)(1~31),如19
      • %F:ISO 8601 日期格式 (YYYY-MM-DD),如 2012-01-19
      • %g:ISO 8601 年的最后2位数(00~99),如12
      • %G:ISO 8601 的年,如 2012
      • %h:与 %b 相同,缩写的月名
      • %H:小时(24小时制)(00~23)
      • %I:小时(12小时制)(01~12)
      • %j:年日(001~366),如019
      • %m:月(01~12),如 01
      • %M:分(00~59),如 24
      • %n:换行符
      • %pAM/PM
      • %r:本地时间(12小时制),如 09:24:52 PM
      • %R:与 %H:%M相同
      • %S:秒(00~60),如 52
      • %t:水平制表符
      • %T:同 %H:%M:%S 相同,如 21:24:52
      • %u:ISO 8601 周几(1~7,1为周一)
      • %U:一年的星期日周数(00~53)
      • %V:ISO 8601 周数(01~53)
      • %w:周几:(0~6,周日为0)
      • %W:一年的星期一周数(00~53)
      • %x:本地日期,如 01/19/12
      • %X:本地时间,如21:24:52
      • %y:年的最后两位(00~99)
      • %Y:年,如2012
      • %z:ISO 8601 格式的UTC偏移量,如 -0500
      • %Z:时区名,如EST
      • %%:百分号
  10. strptime函数:它是strftime的逆向过程,把时间字符串转换成struct tm时间

    #include<time.h> char *strptime(const char*restrict buf,const char*restrict format, struct tm*restrict tmptr);

    • 参数:

      • buf:存放已经格式化的时间字符串的缓冲区的地址
      • format:给出了buf缓冲区中的格式化时间字符串的格式
      • tmptr:存放时间的struct tm结构的指针
    • 返回值:

      • 成功:返回非NULL
      • 失败:返回NULL

    注意:strptime的格式化说明与strftime的几乎相同,但是下列会有区别

    • %a:缩写或者完整的周日名
    • %A:同%a
    • %b:缩写或者完整的月名
    • %B:同%b
    • %n:任何空白
    • %t:任何空白
$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('
    ').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    本文转载自taoyanqi8932博客,版权归taoyanqi8932所有

    扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

    unix环境高级编程 可以用linux学吗

    UNIX环境高级编程》这本书对于初学者来说还太难。建议从基础开始学习。 linux:   Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和中国络协议。它支持32位和64位硬件。Linux继承了Unix以中国络为核心的设计思想,是一个性能稳定的多用户中国络操作系统。   Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。   严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统

    本人在学unix,但是感觉入不了门,除了《unix环境高级编程》,还有其他好书籍吗

    我感肯定你对unix这个系统是不怎么了解的,你先把unix环境高级编程放放吧,先看看鸟哥的linux私房菜或者其他入门级的书,对unix和类unix系统有一个大概的了解吧,把C语言学精了,推荐C和指针,C缺陷,C专家编程,说实在的unix环境高级编程就是说明内核提供的一系列调用接口接着用C加以描述,比较进阶的书,推荐在看看操作系统相关的书,最近有出一本linux设计思想的书,推荐买来看看,有时间看C程序与底层硬件如何进行交互的书,推荐深入理解计算机系统,学unix就不仅仅学编程,还有操作系统相关原理的知识还有硬件的知识啊,希望你能采纳。

    UNIX环境高级编程的作品目录

    第1章 UNIX基础知识 1

    1.1 引言 1

    1.2 UNIX体系结构 1

    1.3 登录 1

    1.4 文件和目录 3

    1.5 输入和输出 6

    1.6 程序和进程 8

    1.7 出错处理 10

    1.8 用户标识 12

    1.9 信号 14

    1.10 时间值 15

    1.11 系统调用和库函数 16

    1.12 小结 17

    习题 18

    第2章 UNIX标准化及实现 19

    2.1 引言 19

    2.2 UNIX标准化 19

    2.2.1 ISO C 19

    2.2.2 IEEE POSIX 20

    2.2.3 Single UNIX Specification 25

    2.2.4 FIPS 26

    2.3 UNIX系统实现 26

    2.3.1 SVR4 26

    2.3.2 4.4BSD 27

    2.3.3 FreeBSD 27

    2.3.4 Linux 27

    2.3.5 Mac OS X 28

    2.3.6 Solaris 28

    2.3.7 其他UNIX系统 28

    2.4 标准和实现的关系 28

    2.5 * 29

    2.5.1 ISO C* 29

    2.5.2 POSIX* 30

    2.5.3 XSI* 32

    2.5.4 sysconf、pathconf和fpathconf函数 32

    2.5.5 不确定的运行时* 38

    2.6 选项 42

    2.7 功能测试宏 44

    2.8 基本系统数据类型 45

    2.9 标准之间的冲突 45

    2.10 小结 46

    习题 46

    第3章 文件I/O 47

    3.1 引言 47

    3.2 文件描述符 47

    3.3 open函数 48

    3.4 creat函数 49

    3.5 close函数 50

    3.6 lseek函数 50

    3.7 read函数 53

    3.8 write函数 54

    3.9 I/O的效率 54

    3.10 文件共享 56

    3.11 原子操作 59

    3.12 dup和dup2函数 60

    3.13 sync、fsync和fdatasync函数 61

    3.14 fcntl函数 62

    3.15 ioctl函数 66

    3.16 /dev/fd 67

    3.17 小结 68

    习题 68

    第4章 文件和目录 71

    4.1 引言 71

    4.2 stat、fstat和lstat函数 71

    4.3 文件类型 72

    4.4 设置用户ID和设置组ID 74

    4.5 文件访问权限 75

    4.6 新文件和目录的所有权 77

    4.7 access函数 77

    4.8 umask函数 79

    4.9 chmod和fchmod函数 81

    4.10 粘住位 83

    4.11 chown、fchown和lchown函数 84

    4.12 文件长度 85

    4.13 文件截短 86

    4.14 文件系统 86

    4.15 link、unlink、remove和rename函数 89

    4.16 符号链接 91

    4.17 symlink和readlink函数 94

    4.18 文件的时间 94

    4.19 utime函数 95

    4.20 mkdir和rmdir函数 97

    4.21 读目录 98

    4.22 chdir、fchdir和getcwd函数 102

    4.23 设备特殊文件 104

    4.24 文件访问权限位小结 106

    4.25 小结 106

    习题 107

    第5章 标准I/O库 109

    5.1 引言 109

    5.2 流和FILE对象 109

    5.3 标准输入、标准输出和标准出错 110

    5.4 缓冲 110

    5.5 打开流 112

    5.6 读和写流 114

    5.7 每次一行I/O 116

    5.8 标准I/O的效率 117

    5.9 二进制I/O 119

    5.10 定位流 120

    5.11 格式化I/O 121

    5.12 实现细节 125

    5.13 临时文件 127

    5.14 标准I/O的替代软件 130

    5.15 小结 130

    习题 130

    第6章 系统数据文件和信息 133

    6.1 引言 133

    6.2 口令文件 133

    6.3 阴影口令 136

    6.4 组文件 137

    6.5 附加组ID 138

    6.6 实现的区别 139

    6.7 其他数据文件 139

    6.8 登录账户记录 140

    6.9 系统标识 141

    6.10 时间和日期例程 142

    6.11 小结 146

    习题 146

    第7章 进程环境 147

    7.1 引言 147

    7.2 main函数 147

    7.3 进程终止 147

    7.4 命令行参数 151

    7.5 环境表 152

    7.6 C程序的存储空间布局 152

    7.7 共享库 154

    7.8 存储器分配 154

    7.9 环境变量 157

    7.10 setjmp和longjmp函数 159

    7.11 getrlimit和setrlimit函数 164

    7.12 小结 168

    习题 168

    第8章 进程控制 171

    8.1 引言 171

    8.2 进程标识符 171

    8.3 fork函数 172

    8.4 vfork函数 176

    8.5 exit函数 178

    8.6 wait和waitpid函数 179

    8.7 waitid函数 183

    8.8 wait3和wait4函数 184

    8.9 竞争条件 185

    8.10 exec函数 188

    8.11 更改用户ID和组ID 192

    8.12 解释器文件 196

    8.13 system函数 200

    8.14 进程会计 203

    8.15 用户标识 208

    8.16 进程时间 208

    8.17 小结 210

    习题 211

    第9章 进程关系 213

    9.1 引言 213

    9.2 终端登录 213

    9.3 网络登录 216

    9.4 进程组 218

    9.5 会话 219

    9.6 控制终端 220

    9.7 tcgetpgrp、tcsetpgrp和tcgetsid函数 221

    9.8 作业控制 222

    9.9 shell执行程序 225

    9.10 孤儿进程组 228

    9.11 FreeBSD实现 230

    9.12 小结 231

    习题 232

    第10章 信号 233

    10.1 引言 233

    10.2 信号概念 233

    10.3 signal函数 240

    10.4 不可靠的信号 242

    10.5 中断的系统调用 244

    10.6 可重入函数 246

    10.7 SIGCLD语义 248

    10.8 可靠信号术语和语义 250

    10.9 kill和raise函数 251

    10.10 alarm和pause函数 252

    10.11 信号集 256

    10.12 sigprocmask函数 258

    10.13 sigpending函数 259

    10.14 sigaction函数 261

    10.15 sigsetjmp和siglongjmp函数 266

    10.16 sigsuspend函数 268

    10.17 abort函数 274

    10.18 system函数 276

    10.19 sleep函数 280

    10.20 作业控制信号 282

    10.21 其他特征 284

    10.22 小结 285

    习题 285

    第11章 线程 287

    11.1 引言 287

    11.2 线程概念 287

    11.3 线程标识 288

    11.4 线程的创建 288

    11.5 线程终止 291

    11.6 线程同步 297

    11.7 小结 311

    习题 311

    第12章 线程控制 313

    12.1 引言 313

    12.2 线程* 313

    12.3 线程属性 314

    12.4 同步属性 318

    12.5 重入 324

    12.6 线程私有数据 328

    12.7 取消选项 331

    12.8 线程和信号 333

    12.9 线程和fork 336

    12.10 线程和I/O 339

    12.11 小结 340

    习题 340

    第13章 守护进程 341

    13.1 引言 341

    13.2 守护进程的特征 341

    13.3 编程规则 342

    13.4 出错记录 345

    13.5 单实例守护进程 348

    13.6 守护进程的惯例 350

    13.7 客户进程-服务器进程模型 354

    13.8 小结 354

    习题 354

    第14章 高级I/O 355

    14.1 引言 355

    14.2 非阻塞I/O 355

    14.3 记录锁 357

    14.4 STREAMS 370

    14.5 I/O多路转接 379

    14.5.1 select和pselect函数 381

    14.5.2 poll函数 384

    14.6 异步I/O 386

    14.6.1 系统V异步I/O 386

    14.6.2 BSD异步I/O 387

    14.7 readv和writev函数 387

    14.8 readn和writen函数 389

    14.9 存储映射I/O 390

    14.10 小结 395

    习题 396

    第15章 进程间通信 397

    15.1 引言 397

    15.2 管道 398

    15.3 popen和pclose函数 403

    15.4 协同进程 408

    15.5 FIFO 412

    15.6 XSI IPC 415

    15.6.1 标识符和键 415

    15.6.2 权限结构 416

    15.6.3 结构* 417

    15.6.4 优点和缺点 417

    15.7 消息队列 418

    15.8 信号量 422

    15.9 共享存储 427

    15.10 客户进程-服务器进程属性 432

    15.11 小结 434

    习题 434

    第16章 网络IPC:套接字 437

    16.1 引言 437

    16.2 套接字描述符 437

    16.3 寻址 439

    16.3.1 字节序 440

    16.3.2 地址格式 441

    16.3.3 地址查询 442

    16.3.4 将套接字与地址绑定 449

    16.4 建立连接 450

    16.5 数据传输 452

    16.6 套接字选项 464

    16.7 带外数据 466

    16.8 非阻塞和异步I/O 467

    16.9 小结 468

    习题 468

    第17章 高级进程间通信 469

    17.1 引言 469

    17.2 基于STREAMS的管道 469

    17.2.1 命名的STREAMS管道 472

    17.2.2 唯一连接 473

    17.3 UNIX域套接字 476

    17.3.1 命名UNIX域套接字 477

    17.3.2 唯一连接 478

    17.4 传送文件描述符 482

    17.4.1 经由基于STREAMS的管道传送文件描述符 484

    17.4.2 经由UNIX域套接字传送文件描述符 486

    17.5 open服务器版本1 493

    17.6 open服务器版本2 498

    17.7 小结 505

    习题 505

    第18章 终端I/O 507

    18.1 引言 507

    18.2 综述 507

    18.3 特殊输入字符 512

    18.4 获得和设置终端属性 516

    18.5 终端选项标志 516

    18.6 stty命令 522

    18.7 波特率函数 523

    18.8 行控制函数 524

    18.9 终端标识 524

    18.10 规范模式 529

    18.11 非规范模式 532

    18.12 终端的窗口大小 537

    18.13 termcap,terminfo和curses 539

    18.14 小结 540

    习题 540

    第19章 伪终端 541

    19.1 引言 541

    19.2 概述 541

    19.3 打开伪终端设备 544

    19.3.1 基于STREAMS的伪终端 547

    19.3.2 基于BSD的伪终端 549

    19.3.3 基于Linux的伪终端 551

    19.4 pty_fork函数 553

    19.5 pty程序 555

    19.6 使用pty程序 559

    19.7 高级特性 564

    19.8 小结 565

    习题 565

    第20章 数据库函数库 567

    20.1 引言 567

    20.2 历史 567

    20.3 函数库 568

    20.4 实现概述 569

    20.5 集中式或非集中式 572

    20.6 并发 574

    20.7 构造函数库 574

    20.8 源代码 575

    20.9 性能 598

    20.10 小结 600

    习题 601

    第21章 与网络打印机通信 603

    21.1 引言 603

    21.2 网络打印协议 603

    21.3 超文本传输协议 605

    21.4 打印假脱机技术 605

    21.5 源代码 607

    21.6 小结 644

    习题 645

    附录A 函数原型 647

    附录B 其他源代码 677

    附录C 部分习题答案 685

    参考书目 709

    索引 715

    《UNIX环境高级编程》这本书怎么看?怎么学习

      Stevens著有三大本:UNIX环境高级编程、TCP/IP详解、UNIX网络编程。

      我是抱着学习网络编程进而阅读web framework源码来学习它们的。

      另外也是想提升一下自己的编程素养,为以后看kernel源码什么的做铺垫。

      首先我是买了这本书,另外两套暂时没买。

      开始也是各种不解,我就是想内核究竟干些啥事,如何通过system_call与之通信?

      其实读这些书需要一些基础的。

      操作系统原理、gcc、shell等等。

      其实我也没全看完,建议先把环境装好(编译apue.h),然后一个一个运行书中示例。当然不是盲目的学,要知道自己差那一块就补那块。

    unix环境高级编程第三版好不好

    简称APUE, unix/linux 系统编程必备宝典, 第三版应该是2013的新版,据说有一些更新 (The new third edition supports today’s leading platforms, reflects new technical advances and best practices, and aligns with Version 4 of the Single UNIX Specification. )

    如果你没有之前的版本,又想了解 unix/linux 系统编程,那么这本书绝对是要买的。 我目前手上的是第二版。

    这绝对是圣经宝典级别的参考书,必备。

  • 本文相关:
  • 【在线笔试题解题报告系列】微软在线笔试之 2016微软探星夏令营在线技术笔试(时间:2016.07.17)
  • [从头读历史] 第307节 星球战争 BC2699 至 BC2600(公元前27世纪)
  • ISO8583报文协议详解
  • cs231n - assignment1 - neural net 梯度推导
  • 80x86微处理器结构及其工作模式
  • 五大NAT穿透方法,解决内网问题
  • 动态代理及其两种实现方式(JDK、CGLIB)
  • 【HDU5721 BestCoder 2nd AnniversaryD】【平面最近点对 分治写法+KD-tree写法】Palace 平面最近点对
  • 《UNIX环境高级编程》--5 标准IO库
  • 原型聚类总结
免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved