摘要: UNIX系统的信号机制最简单的接口是signal函数。signal函数的功能:为指定的信号安装一个新的信号处理函数。#include void (*signal(int signo, void (*func)(int)))(int);复杂原型分开看:void (*signal( int signo, void (*func)(int) ) )(int);函数名 :signal函数参数 :int signo, void (*func)(int)返回值类型:void (*)(int);signo参数是信号名(参见:http://www.cnblogs.com/nufangrensheng/p/35 阅读全文
posted @ 2014-01-10 22:16 ITtecman 阅读(18421) 评论(1) 推荐(1) 编辑
摘要: 信号是软中断,它提供了一种处理异步事件的方法。 首先,每个信号都有一个名字。这些名字都以三个字符SIG开头。 在头文件中,这些信号都被定义为正整数(信号编号)。 实际上,实现将各信号定义在另一个头文件中,但是该头文件又包括在中。通常,若应用程序和内核两者都需使用同一定义,那么就将有关信息放置在内核头文件中,然后用户级头文件再包括该内核头文件。 不存在编号为0的信号。(kill函数对信号编号... 阅读全文
posted @ 2014-01-10 17:52 ITtecman 阅读(1712) 评论(0) 推荐(2) 编辑
摘要: 一个其父进程已终止的进程称为孤儿进程(orphan process),这种进程由init进程“收养”。 整个进程组也可以成为“孤儿”。 孤儿进程组(orphan process group):该组中每个成员的父进程要么是该组中的一个成员,要么不是该组所属会话的成员。 对孤儿进程组的另一种描述:一个进程组不是孤儿进程组的条件是,该组中有一个进程,其父进程属于同一会话的另... 阅读全文
posted @ 2014-01-10 16:22 ITtecman 阅读(371) 评论(0) 推荐(1) 编辑
摘要: 作业控制,它允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问该终端,以及哪些作业在后台运行。作业控制要求下面三种形式的支持:(1)支持作业控制的shell。(2)内核中的终端驱动程序必须支持作业控制。(3)内核必须提供对某些作业控制信号的支持。从shell使用作业控制功能角度讲,用户可以在前台或后台启动一个作业。一个作业只是几个进程的集合,通常是一个进程的管道线。例如:vi main.c在前台启动了只有一个进程组成的一个作业。命令:pr *.c | lpr &make all &在后台启动了两个作业。这两个后台作业调用的所有进程都在后台运行。当启动一个后台作业时 阅读全文
posted @ 2014-01-10 15:05 ITtecman 阅读(772) 评论(0) 推荐(0) 编辑
摘要: 需要有一种方法来通知内核哪一个进程组是前台进程组,这样,终端设备驱动程序就能了解将终端输入和终端产生的信号送到何处。#include pid_t tcgetpgrp( int filedes );返回值:若成功则返回前台进程组的进程组ID,若出错则返回-1int tcsetpgrp( int filedes, pid_t pgrpid );返回值:若成功则返回0,若出错则返回-1函数tcgetpgrp返回前台进程组的进程组ID,该前台进程组与在filedes上打开的终端相关联。如果进程有一个控制终端,则该进程可以调用tcsetpgrp将前台进程组ID设置为pgrpid。pgrpid的值应当是在 阅读全文
posted @ 2014-01-10 14:07 ITtecman 阅读(4363) 评论(0) 推荐(1) 编辑
摘要: 会话和进程组有一些其他特性: 一个会话可以有一个控制终端(controlling terminal)。这通常是登录到其上的终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。 建立与控制终端连接的会话首进程被称为控制进程(controlling process)。 一个会话中的几个进程组可被分成一个前台进程组(foreground process group)以及一个... 阅读全文
posted @ 2014-01-10 11:52 ITtecman 阅读(3023) 评论(0) 推荐(2) 编辑
摘要: 会话(session)是一个或多个进程组的集合。 例如,可以具有图9-6中所示的安排。其中,在一个会话中有三个进程组。 图9-6 进程组和会话中的进程安排 通常是由shell的管道线将几个进程变成一组的。例如,图9-6中的安排可能是由下列形式的shell命令形成的: proc1 | proc2 & pro... 阅读全文
posted @ 2014-01-10 11:27 ITtecman 阅读(1665) 评论(0) 推荐(1) 编辑
摘要: 每个进程除了有一个进程ID之外,还属于一个进程组。 进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。进程组ID类似于进程ID——它是一个正整数,并可存放在pid_t数据类型中。函数getpgrp返回调用进程的进程组ID。 #include pid_t getpgrp(void);返回值:调用进程的进程组ID在早期... 阅读全文
posted @ 2014-01-10 11:02 ITtecman 阅读(2118) 评论(0) 推荐(0) 编辑
摘要: 通过串行终端登录至系统和经由网络登录至系统两者之间的主要(物理上的)区别是:通过网络登录时,终端和计算机之间的连接不是点对点连接。在这种情况下,login只是一种可用的服务,这与其他网络服务(例如FTP或SMTP)的性质相同。 在终端登录中,init知道哪些终端设备可用来进行登录,并为每个设备生成一个getty进程。但是在网络登录情况下,所有登录都经由内核的网络接口驱动程序(如以太网驱动程序),... 阅读全文
posted @ 2014-01-10 10:35 ITtecman 阅读(457) 评论(0) 推荐(0) 编辑
摘要: 在早期的UNIX系统中,用户用哑终端(用硬连接连到主机,更多关于哑终端:http://zh.wikipedia.org/wiki/%E5%93%91%E7%BB%88%E7%AB%AF)进行登录。终端要么是本地的(直接连接)要么是远程的(通过调制解调器连接)。在这两种情况下,登录都经由内核中的终端设备驱动程序。1、BSD终端登录系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名和传递给getty程序的参数,例如,参数之一说明了终端的波特率等。当系统自举时,内核创建ID为1的进程,也就是init进程。init进程使系统进入多用户状态。init进程读文件/e 阅读全文
posted @ 2014-01-10 09:08 ITtecman 阅读(1083) 评论(0) 推荐(0) 编辑