标签:竞争条件 高级 包含 高级编程 ctr 管道 多个 pid_t 并且
1.终端登陆:init使系统进入多用户状态。
/etc/ttys:包含了终端设备,一行有设备名和传递给getty程序的参数。
init从ttys文件读数据,对每一个可以登录的终端设备进行一次fork,得到的子程序进行exec getty程序进行终端开启初始化设置。
getty程序1.调用open2.添加文件描述符3.getty输出“login:”等用户输入用户名,getty结束。login调用crypt进行密码验证,与阴影口令文件中pw_passwd比较,如果失败,父进程再次fork调用getty等待login
getty:用来开启终端,进行终端初始化,设置终端。
2.进程组,是一个或者多个进程的集合。getpgrp(void) = getpgid(pid)得到进程组。
至少有一个组员,有一个或者0个组长,进程组长是进程ID=组ID的程序。进程组长可以创建终止组里面的组员)。
3.setpgid(pid_t pid, pid_t pgid)//加入一个现有的组,或者创建一个新进程组。
把pid进程的进程组设置为pgid。如果pid=pgid,或者pgid为0,pid上任成为组长进程组ID委pid;为了也能使用调用者的进程ID,如果pid为0,使用调用者的进程ID;只能设置自己和子进程的进程组ID,子进程调用了exec则不可以对子进程进行改变。为了防止父子进程次序不确定产生竞争条件,组员和组长都设置子进程的进程组ID
4.会话。会话是一个或多个进程组的集合。shell管道线把几个进程编成一组。
关于创建新会话,只能由非组长创建,不然会出错,可以由组长的子进程创建。创建之后,该会话成为会话首进程,创建了只有一个组员的新的会话组,并且该会话组没有控制终端。想获得新会话的会话首进程可以调用getsid函数
5控制终端:一个会话有一个控制终端,会话首进程是控制进程,有前台进程组一个,其他都是后台进程组,会话首进程也属于后台。
中断:DELETE、CTRL+C,退出:CTRL+\通知前台进程组;断网通知会话首进程。获得前台进程组tcgetpgrp函数
6.孤儿进程组:所有的子进程和父进程都不在一个会话。
标签:竞争条件 高级 包含 高级编程 ctr 管道 多个 pid_t 并且
原文地址:http://www.cnblogs.com/yinsheng1/p/6212025.html