所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程序运行环境.这种软件有个专业术语名称:内核.因为它小且位于计算机体系的核心.如下图所示: 上图中的系统调用包裹在内核的外围,隔离开内核以保护内核.同时,系统调用作为和内核沟通的中间桥梁. 公用函数库通常指的是C/C++的标准库,例如libc.glibc.libstdc++.libc++等标准库,不同…
在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易. ISO C 1989年,C语言首个标准得到批准,其为C89.次年,一个带有小改动的版本标准被批准其为C90.因此,C89和C90通常指同一种语言.在2000年三月,ANSI采纳了ISO/IEC 9899:1999标准.这个标准通常指C99.在2011年12月,ANSI采纳了ISO/IEC 9899:2011标准.这个标准通常即C11,它是C程序语言的现行标准. 按照ISO C标…
本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一,ISO C做出了标准说明. 标准I/O库相比于操作系统的I/O库,具有更高的效率和可移植性,前者是因为标准I/O库提供了缓冲和块长度优化功能,后者是因为使用标准I/O库的代码不仅能在各UNIX系统上移植,也能在支持标准C的非UNIX系统上移植. 流和FILE对象 UNIX系统I/O是建立在文件描述…
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一个非负数的唯一ID来表示和区分,虽然是唯一的,但成立条件是某一时刻,进程ID可以在不同时刻复用,当一个进程终止后,其ID就称为复用的候选者,UNIX系统通常会有一个延迟的复用算法,使得新创建的进程ID不同于最近一段时间内终止的进程ID,以避免将新进程误认为是之前已终止的那个进程. 进程ID为1的通常…
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开始执行的,其中这个总是从main函数开始执行是我们人为约定的,因为main( )函数也是当做一个函数被调用的,所以需要被系统知道被调函数的名字,当然现在从main函数开始执行已经成为语言标准了,在汇编层次,我们可以把程序起始执行地址指向一个自定义的名字. 书本上7.2节这里的翻译很是生硬,字面意思直…
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj 来查看守护进程.例如下图: 从上图中可以看到 TTY 一列,该列显示每个进程的终端,对于问号(?)显示的进程,表明该进程没有控制终端.而CMD列中方括号[ ]显示的进程表明这是一个内核守护进程,对于用户守护进程则没有方括号[ ]. 编程规则 如果需要编写进程守护程序,则需要遵循一些基本规则,具体如下…
在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程.执行新程序.终止进程等.在使用fork( )产生新进程后,就出现了进程父子进程的概念,这是进程间的关系.本章更加详细地说明进程间的关系,包括:进程组.会话.作业等. 终端登录 当我们通过硬件终端而非网络终端登录到系统时,UNIX会有一个登录流程,该流程是个大概的过程,各个实现可能存在细微差别,但总体流程不变. 在通过终端登录时,init进程负责为每个终端fork一个子进程,由子进程对应登录终端设备.init进程会fo…
UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的口令,文件中每行的一般格式为: 用户名:x:用户ID:用户组ID:说明信息:个人主目录:SHELL 对于第二项x来说是密码,但由于安全原因密码已经被移至其他文件,因此使用x来代替. UNIX系统提供了两个用于获取passw…
上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Memory,另外还有第10章介绍的信号Signal.这六种IPC各有差异,但是都存在一个共同的限制:它们仅能用于同一台计算机上的进程间通信,不能用于不同计算机间的进程间通信.本章将说明一种既可以用于计算机内进程通信,又可以用于计算机间进程通信的UNIX服务,即:网络IPC:套接字. 套接字描述符 对于套…
这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另一种是其他系统调用.前一种是可能导致主调进程永久阻塞的一种系统调用,比如管道,当另一端没有准备好时,一端对其读或写可能会永久阻塞. 一旦一个进程可能被永久阻塞这就表明程序有可能在某点彻底瘫痪,为了预防这样的情况发生,可以使用非阻塞I/O来避免.非阻塞I/O能够使得进程不会陷入永久阻塞的陷阱,当操作不…