《UNIX环境高级编程》的笔记

  • 第1章:UNIX基础知识
    第1章:UNIX基础知识
       
       
    ①UNIX体系结构中,最主要的是内核,它有一些称为系统调用的接口与外界交互。在内核之上有shell 和库函数,然后是应用软件。
    ②常见的shell有Bourne shell(sh), Bourne_again shell(bash), C shell(csh), Korn shell(ksh), TENEX C shell(tcsh)。
    ③不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个。
    ④文件描述符(file descriptor)通常是一个小的非负整数。
    ⑤当一个进程收到一个信号时,有三种选择:忽略该信号;按系统默认方式处理;提供一个函数,信号发生时调用这个函数。
    2012-03-02 13:25:37   回应
  • 第2章:UNIX标准及其实现
    第2章:UNIX标准及其实现
       
       
    1、本章介绍了三个主要标准:ISO C、POSIX和Single UNIX Specification 。POSIX标准中的都只是接口,而不是实现,所以不区分系统调用和库函数,都称为函数。Single UNIX Specification(单一UNIX规范)是POSIX.1标准的一个超集,定义了一些附加的接口。
    2、提高移植性的限制有两类:编译时限制和运行时限制。ISO C定义的限制都是编译时限制,列在头文件<limits.h>中。POSIX.1定义的限制和常量有5类:①不变的最小值;②不变值;③运行时可以增加的值;运行时不变的值(可能不确定);⑤路径名可变值(可能不确定)。
    3、如果在编译一个程序时,希望它只使用POSIX的定义而不使用任何其他的定义,就需要定义常量_POSIX_C_SOURCE。
    2012-03-09 12:32:23   回应
  • 第3章:文件I/O
    第3章:文件I/O
       
       
    1、UNIX系统中的大多数文件I/O只需用到5个函数:open、read、write、lseek以及close。由于新的open函数提供了O_CREAT和O_TRUNC选项,也就可以完全替代creat函数了。Lseek函数的作用就是为一个打开的文件设置其当前文件偏移量,定位读写的位置。
    2、内核使用三种数据结构表示打开的文件:进程表中的一个记录项、文件表、v节点(在Linux中由通用型的i节点来实现)。
    3、使用pread和pwrite函数可以实现原子读写。Dup和dup2函数可以复制一个现存的文件描述符。Sync、fsync和fdatasync函数可以使放在缓存中的数据写入磁盘,免得系统崩溃时造成数据丢失。Fcntl函数可以改变已打开文件的性质。
    2012-03-11 09:08:11   回应
  • 第4章:文件和目录
    第4章:文件和目录
       
       
    1、本章讨论的中心是3个stat函数以及它们返回的信息。Stat函数返回文件的信息结构,fstat函数获取描述符为filedes的文件的有关信息,lstat可以返回符号链接的有关信息而不是它所指向的文件的有关信息。
    2、其他函数:access函数按实际用户ID和实际组ID进行访问权限测试;umask函数为进程设置文件模式创建屏蔽字;chmod和fchmod函数用于更改现有文件的访问权限;chown、fchown和lchown函数用于更改文件的用户ID和组ID;truncate和ftruncate函数把现有文件截短为参数length字节;link、unlink创建和删除一个指向现有文件的链接(硬链接);symlink函数创建一个符号链接;utime函数可以更改一个文件的访问和修改时间;chdir、fchdir函数可以更改当前工作目录;getcwd返回工作目录的绝对路径。
    2012-03-12 16:19:23   回应
  • 第5章:标准I/O库
    第5章:标准I/O库
       
       
    1、在UNIX系统中,标准I/O库最终都要调用第3章中说明的I/O例程。
    2、当用标准I/O库打开或创建一个一个文件时,我们已使一个流与一个文件相关联。每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获取其描述符。
    3、对一个进程预定义了3个流:标准输入、标准输出和标准出错。
    4、打开标准I/O流的函数:fopen、freopen、fdopen。用fclose函数关闭。
    5、流的读写函数:getc、putc,fgetc、fputc,getchar、putchar,fgets、fputs,gets、puts(这一对不推荐使用)。
    6、格式化输入输出函数:printf、scanf,fprintf、fscanf,sprintf、snprintf、sscanf。
    7、使用tmpnam和tmpfile函数可以创建临时文件。
    2012-03-13 12:17:03   回应
  • 第6章:系统数据文件和信息
    第6章:系统数据文件和信息
       
       
    1、一般情况下,对于每个数据文件至少有三个函数:get函数,读出记录;set函数,打开文件然后反绕它;end函数,关闭文件。
    2、与用户ID相关的几个重要的文件是:口令文件(passwd);阴影口令文件(shadow);组文件(group);utmp文件,记录当前登录进系统的各个用户;wtmp文件,跟踪各个登录和注销事件。
    3、关于时间和日期的一个函数。Time函数返回当前时间:自1970年1月1日零时以来的秒数,而且是国际标准时间。Gettimeofday函数与time类似,只是可以提供更高的分辨率(微秒)。Localtime和gmtime函数将日历时间转换成以年、月、日、时、分、秒周日表示的时间,填充struct tm结构。而mktime函数则相反,转换成time_t值,也就是日历时间。Asctime和ctime函数产生26字节的字符串,表示年月日时分秒等信息。Strftime函数提供格式化的时间表示,类似于printf函数。
    2012-03-14 11:01:43   回应
  • 第7章:进程环境
    第7章:进程环境
       
       
    1、进程的正常终止大多是调用exit函数,它先调用各终止处理程序(由atexit函数登记),然后按需多次调用fclose关闭打开的所有流。
    2、一个C程序的组成部分:正文段(指令)、初始化数据段、非初始化数据段(bss)、栈(函数调用时使用)、堆(动态存储分配)。
    3、存储空间的动态分配函数有3个:malloc、calloc、realloc。而free函数释放存储空间。
    4、系统中的环境变量由各个应用程序解释使用,内核不过问。相关的3个函数,putenv添加一个环境变量、setenv更改一个环境变量、unsetenv删除一个环境变量。
    5、在C中,goto语句是不能跨越函数的,而执行这类跳转功能的是函数setjmp和longjmp 。
    6、使用getrlimit和setrlimit函数查询和修改系统对一个进程的资源限制。
    2012-03-14 22:19:41   回应
  • 第8章:进程控制
    第8章:进程控制
       
       
    1、每一个进程都有一个非负整型表示的唯一进程ID。这是最重要的一个进程标识符。
    2、本章的重点fork。一个现有进程可以调用fork函数创建一个新进程。有两种用法:一个父进程希望复制自己,使父、子进程同时执行不同的代码段;一个进程想启动一个完全不一样的进程(例如利用shell执行命令)。Fork调用一次返回两次,在子进程中返回0,在父进程中返回子进程的ID。
    3、vfork用于创建一个新进程,但其目的是exec一个新程序。就像fork的第二种用法。但是vfork保证子进程先运行。而对于fork,子进程还是父进程先运行是不确定的。
    4、对于一个进程的任意一种终止情形,我们都希望被终止的进程能够通知其父进程它是如何终止的。终止函数exit、_exit和_Exit把进程的退出状态作为参数传递给函数。
    5、调用wait和waitpid函数可以等待子进程终止的异步信号的通知。但是一个子进程终止之前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
    6、exec函数族。调用exec函数不创建新的进程,前后进程ID并不改变,它只是用一个全新的程序替换了当前进程的正文、数据、堆和栈。一共有6个函数:execl、execv、execle、execve、execlp和execvp。Exec函数的一种变体:解释器文件。Shell脚本是其中比较常见的一种。
    2012-03-19 10:52:05   回应
  • 第9章:进程关系
    第9章:进程关系
       
       
    1、本章最重要的是三个概念:进程组、会话和作业控制。进程组是一个或多个进程的集合,拥有一个唯一的ID,有一个组长进程。进程可以通过调用setpgid来加入一个现有的组或者创建一个新进程组。而会话是一个或多个进程组的集合,进程调用setsid函数建立一个新会话。作业控制允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问终端,哪些作业在后台运行。
    2012-03-21 11:02:09   回应
  • 第10章:信号
    第10章:信号
       
       
    1、这一章是相当重要的一章,用了50多页来讲解。含有大量的实例程序,讲解得比较深入。
    2、信号是软件中断,用于处理异步事件。每一个信号都有一个名字,而且都以三个字符SIG开头,对应一个整型编号。信号产生的情况:①用户按下某些终端按键;②硬件异常;③调用kill函数发送;④用户使用kill命令发送;⑤检测到某种软件条件已经发生。三种信号处理方法:①忽略它;②捕捉它,然后调用特定的用户函数;③执行系统默认动作。
    3、一些与信号有关的重要的函数。Signal函数用于设置某信号的处理程序,在很多平台该函数都是由sigaction函数来实现的。Kill函数将信号发送给进程或进程组。Alarm函数设置过一段时间后发送信号给自己,而pause函数使自己挂起直到捕捉到一个信号。Sigprocmask函数可以检测或更改其信号屏蔽字。Sigpending函数返回对应进程是阻塞的信号集。Sigsuspend函数解除一个阻塞信号并且马上使进程休眠,两步是一个原子操作。Abort函数用于使异常程序终止,进程接收到信号后终止之前可以执行一些必须的清理工作。
  
  
  • 第11章:线程
    第11章:线程
         
         
    1、这一章有三部分的内容,线程的概念、线程的创建和终止、线程的同步。
    2、多线程设计的好处:①使得处理异步事件的代码变得简化。②共享方便。③提高整个程序的吞吐量。④改善交互程序的响应时间。
    3、线程包含了表示进程内执行环境必需的信息,包括线程ID(只在它所属的进程环境中有效)、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。
    4、线程的创建使用pthread_create函数。但是创建后不保证哪一个线程先运行。如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。而单个线程有三种方式推出:①从启动例程中返回。②被同一进程中的其他线程取消。③自己调用pthread_exit函数。
    5、实现线程同步主要有三种方式:使用互斥量、使用读写锁、使用条件变量。
    2012-03-22 10:07:41   回应
  • 第12章:线程控制
    第12章:线程控制
         
         
    1、线程属性存放于数据结构pthread_attr_r中。可以使用函数pthread_attr_init函数来初始化这个数据结构,使用pthread_attr_destroy函数来用无效数值填充,即“反初始化”。使用函数pthread_attr_setdetachstate函数修改结构中的detachstate属性,可以让线程以分离状态启动。线程的栈属性通过pthread_attr_setstack函数来设置。
    2、线程的同步属性包括互斥量属性、读写锁属性、条件变量属性。它们都有对应的进出共享属性,存在于不同的数据结构中。
    3、如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。如果函数对异步信号处理程序的重入是安全的,那么就说函数是异步-信号安全的。
    4、另外是线程属性还有可取消状态和可取消类型。这两个属性影响着线程在响应pthread_cancle函数调用时所呈现的行为。
    2012-03-22 21:03:10   回应
  • 第13章:守护进程
    第13章:守护进程
         
         
    1、守护进程也称精灵进程(daemon)。
    2、守护进程编程规则:①调用umask将文件模式创建屏蔽字设置为0。②调用fork,然后使父进程退出。③调用setsid以创建一个新会话。④将当前工作目录更改为根目录。⑤关闭不再需要的文件描述符。
    3、守护进程没有控制终端,它的出错信息通过syslog设施来记录。对应的函数有openlog、syslog、closelog、setlogmask。
    2012-03-23 20:09:30   回应
  • 第14章:高级I/O
    第14章:高级I/O
         
         
    1、非阻塞I/O使得当我们使用open、read、write这样的操作时,如果不能完成则立即出错返回,不会阻塞。
    2、记录锁对一个文件区域进行加锁,当一个进程正在对一个文件的某区域进行操作时可以阻止被另外一个进程对其的操作而引起的混乱。注意,这不是对整个文件加锁,只是一个文件的指定区域,所以这个锁也叫字节范围锁。
    3、当一个进程需要请求多个描述符时,可以使用I/O多路转接技术来处理。大致是先构造一张有关描述符的表,然后调用一个函数,直到这些描述符中的一个准备好进行I/O时,该函数才返回。可以选择的函数有三个:poll、pselect和select。
    4、高级I/O还提供了一些很有用的扩展函数。Readv和writev函数实现在一次函数调用中读、写多个非连续区域。Readn和writen函数可以指定读、写N个字节的数据,能够自动处理返回值小于要求值的情况,是多次调用read和write函数实现的。
    2012-03-24 01:44:27   回应
  • 第15章:进程间通信
    第15章:进程间通信
         
         
    1、最古老的IPC是管道,它有两方面的局限性:半双工传输(有个别系统实现了全双工);只能在有公共祖先的进程间使用。一些相关函数:pipe函数用于创建一个新管道,popen函数实现创建一个管道然后调用fork产生一个子进程,然后使用管道与其通信。
    2、当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就称为协同进程。
    3、FIFO有时被称为命名管道。一些相关函数:mkfifo用于创建,使用open函数打开。
    4、有三种IPC统称为XSI IPC,分别是消息队列、信号量(其实它真正上是一种同步原语)、共享存储器。每一个XSI IPC结构都有对应的一个非负整型标识符和一个键。三种的创建函数分别为msgget、semget、shmget。
    2012-03-24 12:20:04   回应
  • 第16章:网络IPC:套接字
    第16章:网络IPC:套接字
         
         
    1、套接字是通信端点的抽象,访问套接字要用套接字描述符。创建一个套接字使用socket函数。使用函数shutdown可以禁用一个套接字,通过参数决定关闭写端或者读端。
    2、套接字使用的地址有一个通用的结构:socketaddr结构。使用函数bind可以将地址绑定到一个套接字,而调用函数getsocketname查看绑定到一个套接字的地址。
    3、使用函数connect建立一个连接。对于服务器,可以调用listen函数来宣告可以接受连接请求,然后使用函数accept函数获得连接请求并建立连接。
    4、六个数据传送相关的函数。Send和sendto函数很相似,都是把数据发出去,只是sendto允许在无连接的套接字上指定一个目标地址。而,sendmsg函数可以指定多重缓冲区传输数据,类似于writev函数。Recv函数用来接收数据,recvfrom函数比recv多一个功能是可以得到数据发送者的地址。对应于sendmsg,有recvmsg函数。
    2012-03-25 10:12:40   回应
  • 第17章:高级进程间通信
    第17章:高级进程间通信
         
         
    1、基于STREAMS的管道(简称STRREAMS管道,STREAMS pipe)是一个双向(全双工)管道。可以用fattach函数给STREAMS管道一个文件系统中的名字,使用fdetach函数撤销它。
    2、UNIX域套接字用于在同一台机器上运行的进程之间的通信。提供流和数据报两种接口。使用socketpair函数可以创建一对非命名的、相互连接的UNIX域套接字。
    2012-03-25 16:46:19   回应
  • 第18章:终端I/O
    第18章:终端I/O
         
         
    1、终端设备是由位于内核中的终端驱动程序控制的,都有一个输入队列和输出队列。终端设备的所有特性都包含在termios结构中,该结构有四大标志:c_cflag, c_lflag, c_iflag, c_oflag。使用函数tcgetattr和tcsetattr可以获得和设置termios结构,而在命令行中可以使用stty命令。
    2、终端I/O有两种不同的工作模式:规范模式输入处理(以行为单位处理)和非规范模式输入处理(不以行为单位处理输入数据)。
    2012-03-25 19:58:32   回应
  • 第19章:伪终端
    第19章:伪终端
         
         
    1、伪终端这个术语暗示对于一个应用程序而言,它看上去像一个终端,但实际上应用程序被欺骗了。从内核角度看,伪终端看起来像一个双向管道。而事实上Solaris的伪终端就是用STREAMS构建的。
    2、一些相关的调用函数。Posix_openpt函数用来打开下一个可用的伪终端主设备。用于更改权限的两个函数是grantpt和unlockpt。确定路径名用ptsname函数。
    3、当我们用pty来执行另外一个程序时,该程序在一个它自己的会话中执行,并和一个伪终端连接。具体对伪终端的应用主要有以下几个。Utmp文件、作业控制交互、检查长时间运行程序的输出、script程序、运行协同进程、用非交互模式驱动交互式程序。
    2012-03-26 08:37:50   回应
  • 第20章:数据库函数库
    第20章:数据库函数库
         
         
    1、本章详细介绍了一个数据库函数库的设计与实现。此函数库包括的一些函数有:数据库的打开与关闭函数:db_open, db_close;存储和删除一条记录:db_store, db_delete;从数据库获取一条记录:*db_fetch;访问数据库所有记录的两个函数:db_rewind, *db_nextrec。
    2、数据库被建立时创建两个文件:索引文件和数据文件。索引文件的数据通常使用散列法或B+树来组织,从而提高数据的访问速度。对于进程对数据库数据的访问,有集中式和非集中式两种实现方法。集中式是指由一个数据库进程作为数据库管理者,所有的数据库访问工作由此进程完成,其它进程通过IPC与此中心进程联系。非集中式是指每个库函数独立申请并发控制,然后自己调用I/O函数。
第21章:与网络打印机通信
第21章:与网络打印机通信
    
    
1、本章实现了两个程序:一个打印假脱机守护进程,用以将作业发送到打印机;一个命令行程序,用以将打印作业提交到假脱机守护进程。与网络打印机通信使用的是网络打印协议(IPP),而它建立在HTTP和TCP/IP的基础之上。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件和目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入和输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出和标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程和进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准和实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf 和fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数 79 4.21 读目录 80 4.22 chdir, fchdir和getcwd函数 84 4.23 特殊设备文件 86 4.24 sync和fsync函数 87 4.25 文件存取许可权位小结 88 4.26 小结 89 习题 89 第5章 标准I/O库 91 5.1 引言 91 5.2 流和FILE对象 91 5.3 标准输入、标准输出和标准出错 91 5.4 缓存 91 5.5 打开流 94 5.6 读和写流 96 5.6.1 输入函数 96 5.6.2 输出函数 97 5.7 每次一行I/O 98 5.8 标准I/O的效率 99 5.9 二进制I/O 100 5.10 定位流 102 5.11 格式化I/O 103 5.11.1 格式化输出 103 5.11.2 格式化输入 103 5.12 实现细节 104 5.13 临时文件 105 5.14 标准I/O的替代软件 108 5.15 小结 108 习题 108 第6章 系统数据文件和信息 110 6.1 引言 110 6.2 口令文件 110 6.3 阴影口令 112 6.4 组文件 113 6.5 添加组ID 114 6.6 其他数据文件 115 6.7 登录会计 116 6.8 系统标识 116 6.9 时间和日期例程 117 6.10 小结 121 习题 121 第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8 存储器分配 128 7.9 环境变量 130 7.10 setjmp 和longjmp函数 132 7.10.1 自动、寄存器和易失变量 134 7.10.2 自动变量的潜在问题 136 7.11 getrlimit 和setrlimit函数 136 7.12 小结 139 习题 140 第8章 进程控制 141 8.1 引言 141 8.2 进程标识 141 8.3 fork函数 142 8.4 vfork 函数 145 8.5 exit函数 147 8.6 wait和waitpid函数 148 8.7 wait3和wait4函数 152 8.8 竞态条件 153 8.9 exec函数 156 8.10 更改用户ID和组ID 160 8.10.1 setreuid 和setregid函数 162 8.10.2 seteuid和 setegid函数 163 8.10.3 组ID 163 8.11 解释器文件 164 8.12 system函数 167 8.13 进程会计 171 8.14 用户标识 175 8.15 进程时间 176 8.16 小结 178 习题 178 第9章 进程关系 180 9.1 引言 180 9.2 终端登录 180 9.2.1 4.3+BSD终端登录 180 9.2.2 SVR4终端登录 182 9.3 网络登录 182 9.3.1 4.3+BSD网络登录 182 9.3.2 SVR4网络登录 183 9.4 进程组 183 9.5 对话期 184 9.6 控制终端 185 9.7 tcgetpgrp 和tcsetpgrp函数 187 9.8 作业控制 187 9.9 shell执行程序 189 9.10 孤儿进程组 193 9.11 4.3+BSD实现 195 9.12 小结 197 习题 197 第10章 信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 10.3.1 程序起动 205 10.3.2 进程创建 206 10.4 不可靠的信号 206 10.5 中断的系统调用 207 10.6 可再入函数 209 10.7 SIGCLD语义 211 10.8 可靠信号术语和语义 213 10.9 kill和raise函数 213 10.10 alarm和pause函数 214 10.11 信号集 219 10.12 sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 sigsuspend函数 229 10.17 abort函数 234 10.18 system函数 235 10.19 sleep函数 240 10.20 作业控制信号 241 10.21 其他特征 243 10.21.1 信号名字 243 10.21.2 SVR4信号处理程序的附 加参数 244 10.21.3 4.3+BSD信号处理程序的附 加参数 244 10.22 小结 244 习题 244 第11章 终端I/O 246 11.1 引言 246 11.2 综述 246 11.3 特殊输入字符 250 11.4 获得和设置终端属性 254 11.5 终端选择标志 254 11.6 stty命令 258 11.7 波特率函数 259 11.8 行控制函数 260 11.9 终端标识 260 11.10 规范方式 263 11.11 非规范方式 266 11.12 终端的窗口大小 270 11.13 termcap, terminfo和 curses 271 11.14 小结 272 习题 272 第12章 高级I/O 273 12.1 引言 273 12.2 非阻塞I/O 273 12.3 记录锁 275 12.3.1 历史 276 12.3.2 fcntl记录锁 276 12.3.3 锁的隐含继承和释放 280 12.3.4 4.3+BSD的实现 281 12.3.5 建议性锁和强制性锁 284 12.4 流 288 12.4.1 流消息 289 12.4.2 putmsg和putpmsg函数 290 12.4.3 流ioctl操作 291 12.4.4 write至流设备 294 12.4.5 写方式 294 12.4.6 getmsg和getpmsg函数 294 12.4.7 读方式 295 12.5 I/O多路转接 296 12.5.1 select函数 298 12.5.2 poll函数 301 12.6 异步I/O 303 12.6.1 SVR4 303 12.6.2 4.3+BSD 303 12.7 readv和writev函数 304 12.8 readn和writen函数 306 12.9 存储映射I/O 307 12.10 小结 311 习题 311 第13章 精灵进程 312 13.1 引言 312 13.2 精灵进程的特征 312 13.3 编程规则 313 13.4 出错记录 314 13.4.1 SVR4流log驱动程序 315 13.4.2 4.3+BSD syslog设施 316 13.5 客户机-服务器模型 319 13.6 小结 319 习题 319 第14章 进程间通信 320 14.1 引言 320 14.2 管道 320 14.3 popen和pclose函数 325 14.4 协同进程 330 14.5 FIFO 333 14.6 系统V IPC 335 14.6.1 标识符和关键字 336 14.6.2 许可权结构 337 14.6.3 结构限制 337 14.6.4 优点和缺点 337 14.7 消息队列 338 14.8 信号量 342 14.9 共享存储 346 14.10 客户机-服务器属性 351 14.11 小结 353 习题 353 第15章 高级进程间通信 355 15.1 引言 355 15.2 流管道 355 15.3 传送文件描述符 358 15.3.1 SVR4 360 15.3.2 4.3BSD 361 15.3.3 4.3+BSD 364 15.4 open服务器第1版 366 15.5 客户机-服务器连接函数 371 15.5.1 SVR4 372 15.5.2 4.3+BSD 375 15.6 open服务器第2版 378 15.7 小结 385 习题 385 第16章 数据库函数库 386 16.1 引言 386 16.2 历史 386 16.3 函数库 386 16.4 实现概述 388 16.5 集中式或非集中式 390 16.6 并发 391 16.6.1 粗锁 391 16.6.2 细锁 391 16.7 源码 392 16.8 性能 409 16.8.1 单进程的结果 410 16.8.2 多进程的结果 410 16.9 小结 412 习题 412 第17章 与PostScript打印机通信 413 17.1 引言 413 17.2 PostScript通信机制 413 17.3 假脱机打印 415 17.4 源码 417 17.5 小结 434 习题 434 第18章 调制解调器拨号器 435 18.1 引言 435 18.2 历史 435 18.3 程序设计 436 18.4 数据文件 437 18.5 服务器设计 439 18.6 服务器源码 439 18.7 客户机设计 463 18.7.1 终端行规程 463 18.7.2 一个进程还是两个进程 464 18.8 客户机源码 465 18.9 小结 474 习题 474 第19章 伪终端 476 19.1 引言 476 19.2 概述 476 19.2.1 网络登录服务器 477 19.2.2 script程序 478 19.2.3 expect程序 479 19.2.4 运行协同进程 479 19.2.5 观看长时间运行程序的输出 479 19.3 打开伪终端设备 480 19.3.1 SVR4 481 19.3.2 4.3+BSD 482 19.4 pty_fork函数 484 19.5 pty程序 486 19.6 使用pty程序 489 19.6.1 utmp文件 489 19.6.2 作业控制交互 489 19.6.3 检查长时间运行程序的输出 491 19.6.4 script程序 491 19.6.5 运行协同进程 492 19.6.6 用非交互模式驱动交互式 程序 492 19.7 其他特性 494 19.7.1 打包模式 494 19.7.2 远程模式 494 19.7.3 窗口大小变化 495 19.7.4 信号发生 495 19.8 小结 495 习题 495 附录A 函数原型 497 附录B 其他源代码 512 附录C 习题答案 518 参考书目 536

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值