代码改变世界

随笔档案-2009年10月27日

APUE学习笔记(20)-文件记录锁

2009-10-27 11:18 by htc开发, 224 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第14章。2. 总结了文件记录锁的基本概念和使用方法。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。记录锁记录锁(record locking)的功能是:锁定文件中的一个区域(也可能是整个文件),使得当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。其互斥规则与读写锁相同。POSIX.1标准使用fcntl函数作为记录锁的接口。#include <fcntl.h>int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ 阅读全文

APUE学习笔记(21)-IO多路转接

2009-10-27 11:18 by htc开发, 232 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第14章。2. 总结了IO多路转接的概念,以及select、pselect和poll函数的用法。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。IO 多路转接当从一个文件描述符读,然后写到另一个文件描述符,可以在下列形式的循环中使用阻塞IO。while ((n = read(STDIN_FILENO, buf, BUFSIZ)) > 0) if (write(STDOUT_FILENO, buf, n) != n) err_sys("write error");但是,如果必须从两个描述符读,那么就可能 阅读全文

APUE学习笔记(15)-线程同步

2009-10-27 11:16 by htc开发, 122 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第11章。2. 总结了线程同步的三种方法:互斥量、读写锁以及条件变量。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。线程同步是一个老话题了。当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图。APUE介绍的线程同步方式有:互斥量互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。互斥变量用pthread_mutex_t数据类型来表示,在使用前必须对其进行初始化。对于静态分配的互斥量,可以把它设置为常量PTHREAD_MUTEX_INITIALIZER。如果动 阅读全文

APUE学习笔记(9)-进程关系

2009-10-27 11:14 by htc开发, 195 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第9章。2. 总结了关于进程关系和作业控制的一些概念。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。l 可以用ps -o pid,ppid,pgrp,session,tpgid,comm命令,显示进程ID,父进程ID,进程组ID,会话ID,前台进程组ID和命令。l 每个进程除了有一个进程ID之外,还属于一个进程组。进程可以通过调用setpgid加入一个现有的组或者创建一个新进程组。l 每个进程组有一个组长进程,其标识是:进程组ID等于其进程ID。只要组中有一个进程存在,则该进程组就存在,这与组长进程是否终止无关。从进程组创建 阅读全文

APUE学习笔记(8)-执行程序

2009-10-27 11:13 by htc开发, 160 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第8章。2. 总结了如何使用exec函数族为新创建的进程执行程序。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。execfork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,包括进程的正文、数据、堆和栈,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。在执行exec前后实际用户ID和实际组ID也保持不变,但有效ID是否改变取决于所执行程序文件的设置用户ID位和设置组ID位是否设置。 有6种不同 阅读全文

APUE学习笔记(6)-创建进程

2009-10-27 11:12 by htc开发, 121 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第8章。2. 总结了如何使用fork函数创建进程,以及父子进程间的一些关系。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。fork一个现有进程可以调用fork函数创建一个新进程。fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。原因在于,一个进程可以有多个子进程,并且没有一个函数可以获得所有子进程的进程ID;而一个进程只会有一个父进程,并且总能使用getppid获得其父进程的ID。如果系统中已经有太多的进程或者该实际用户ID的进程总数超过了系统限制(CHILD 阅读全文

APUE学习笔记(7)-僵死进程

2009-10-27 11:12 by htc开发, 166 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第8章。2. 总结了进程终止方式和僵死进程的概念,以及使用wait函数获取子进程的终止状态。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。进程终止方式进程有5种正常终止方式:l 在main函数内执行return语句。l 调用exit函数。此函数由ISO C定义,其操作包括调用各终止处理程序(用atexit函数注册),然后关闭所有标准IO流等。l 调用_exit或_Exit函数,并不运行终止处理程序和信号处理程序。l 进程的最后一个线程在其启动例程中执行返回语句。但是,该线程的返回值不会用作进程的返回值,进程以终止状态0返回。 阅读全文

APUE学习笔记(5)-设置用户ID

2009-10-27 11:11 by htc开发, 156 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第4章。2. 总结了用户ID和文件访问权限检查的概念,以及设置用户ID的用法。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。用户ID一个进程与两类ID相关:l 实际用户ID和实际组ID,用于标识用户究竟是谁。这两个字段在登录时取自口令文件中的登录项。可以使用getuid和getgid函数查询。l 有效用户ID和有效组ID,与附加组ID一起,用于文件访问权限检查。可以使用geteuid和getegid函数查询。通常,等于实际用户ID和实际组ID。一个文件仅将其所有者ID和所有组ID记录在stat结构的st_uid和st_gid 阅读全文

APUE学习笔记(4)-文件共享

2009-10-27 11:10 by htc开发, 159 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第3章。2. 主要总结了UNIX系统下描述文件的三种数据结构,以及文件共享的相关概念。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。文件数据结构表示文件的数据结构有三个:l v节点结构,包含a)文件类型b)对此文件进行各种操作的函数的指针c)文件的i节点(索引节点)。i节点包含文件的所有者,文件长度,文件所在的设备,指向文件实际数据块在磁盘上所在位置的指针等等。Linux没有使用v节点,而是使用了通用i节点结构。l 文件表项,内核为所有打开文件维持一张文件表,每个文件表项包含a)文件状态标志(读,写,添加,同步和非阻塞等)b 阅读全文

APUE学习笔记(3)-时间概念

2009-10-27 11:09 by htc开发, 150 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第1、6、8章。2. 总结了UNIX系统下的两种时间概念。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。UNIX系统一直使用两种不同的时间概念:日历时间和进程时间。日历时间保存日历时间的数据类型有三种:l time_t:记录自国际标准时间公元1970年1月1日00:00:00以来经历的秒数。通过time函数返回。文件属性中的最后访问时间,最后修改时间和最后文件属性更改时间,都使用该类型记录。#include <time.h>time_t time(time_t *calptr);l timeval:通过getti 阅读全文

APUE学习笔记(1)-errno变量

2009-10-27 11:08 by htc开发, 243 阅读, 收藏,
摘要: 写在前面1. 本文内容对应《UNIX环境高级编程》(第2版)》第1章。2. 主要介绍errno变量的使用,包括如何打印出错消息,以及多线程下的errno变量。3. 希望本文对您有所帮助,也欢迎您给我提意见和建议。errno变量当函数出错时,常常返回一个负值(-1),而且整型变量errno通常被设置为含有附加信息的一个值。例如,open函数如果成功执行则返回一个非负的文件描述符,如果出错则返回-1。在open出错时,有大约15种不同的errno值(如文件不存在,权限问题等)。变量errno定义在文件<errno.h>中。在linux下,可以赋予它的各种常量在<asm-gener 阅读全文

APUE学习笔记(1)-限制查询

2009-10-27 11:05 by htc开发, 169 阅读, 收藏,
摘要: 写在前面1. 学习linux环境下的编程,《UNIX环境高级编程》(行话叫APUE)应该是必读的一本书。毫无疑问,APUE可以作为API的参考手册。但是,个人认为书中的许多概念和思想仍然需要细细揣摩。细节的积累,一来是良好模式设计的基础,二来为学习内核知识提供了上层视角。读书笔记的目的正在于此,而linux开放、自由的思想始终是一种原动力。2. APUE.2e及其源码可以从这里下载。源码在linux下的编译需要做几处修改,可以参考《在Linux下编译APUE的例子》。我使用的系统是Ubuntu 9.04(linux-2.6.29.3,gcc-4.3.3)。3. 关于Makefile和GDB的使 阅读全文