输入和输出
1.文件描述符
文字描述符是一个小的非负整数,内核用以标识一个特定进程正在存访的文件。当内核打开一个现存文件或创建一个新文件时,它就返回一个文件描述符。当读、写文件时,就可使用它。
2.标准输入、标准输出和标准出错
按惯例,每当运行一个新程序时,所有的 shell都为其打开三个文件描述符:标准输入、标准输出以及标准出错。如果像简单命令 l s那样没有做什么特殊处理,则这三个描述符都连向终端。大多数shell都提供一种方法,使任何一个或所有这三个描述符都能重新定向到某一个文件,例如:
ls > file.list
执行ls命令,其标准输出重新定向到名为file.list的文件上。
3.不用缓存的 I / O
函数o p e n、r e a d、w r i t e、l s e e k以及c l o s e提供了不用缓存的 I / O。这些函数都用文件描述符进行工作。
信号
信息是通知进程已发生某种条件的一种技术。例如,若某一进程执行除法操作,其除数为0,则将名为S I G F P E的信号发送给该进程。进程如何处理信号有三种选择:
(1) 忽略该信号。有些信号表示硬件异常,例如,除以0或访问进程地址空间以外的单元等,为这些异常产生的后果不确定,所以不推荐使用这种处理方式。
(2) 按系统默认方式处理。对于除数为0,系统默认方式是终止该进程。
(3) 提供一个函数,信号发生时则调用该函数。使用这种方式,我们将能知道什么时候产生了信号,并按所希望的方式处理它。很多条件会产生信号。有两种键盘方式,分别称为中断键 (interrupt key,通常是 D e l e t e键或C t r l - C )和退出键 (quit key,通常是 C t r l - \ ),它们被用于中断当前运行进程。另一种产生信号的方法是调用名为 k i l l的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。当然这样做也有些限制:当向一个进程发送信号时,我们必需是该进程的所有者或者是超级用户。
系统调用(system call)和库函数的差别
- U N I X提供决定当前时间和日期的界面。某些操作系统提供一个系统调用以返回时间,而另一个则返回日期。任何特殊的处理,例如正常时制和夏时制之间的转换,由内核处理或要求人为干预。U N I X则不同,它只提供一条系统调用,该系统调用返回国际标准时间 1 9 70年1月1日零点以来所经过的秒数。对该值的任何解释,例如将其变换成人们可读的,使用本地时区的时间和日期,都留给用户进程运行。在标准C库中,提供了若干例程以处理大多数情况。这些库函数处理各种细节,例如各种夏时制算法。
- 系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。比如:sbrk系统调用和malloc库函数之间的差别是sbrk系统调用是按指定字节数增加或减少进程地址空间,而malloc则是一种特定类型的分配,如果不喜欢其操作方式,可自定义malloc函数。