- 论坛徽章:
- 0
|
本文总结了几个概念:terminal, session, jobs, process group
终端登录
首先来看看终端的一般登录过程。
init--->fork init在每个终端--> getty --> login
我们知道init是linux启动后第一个运行的用户级进程。init查看/etc/inittab配置文件,根据不同的运行级别调用对应的程序。然后每个终端fork一个init,该终端下的init启动getty进程,getty打开终端设备文件,把stdin,stdout,stderr重定向到终端设备,再运行login弹出登录提示,输入密码后登录完成,启动对应的shell,把进程归属设定为对应的用户。
如果是从网络登录,getty变成xinetd下的对应服务,例如telnetd, 把std输入输出重定向到对应的伪终端(pty)设备文件。
伪终端,tty,pts
传统意义的终端(tty)一般用串口连接上主机,在linux上串口的设备是以ttyS*命名。而通过网络登录,或GUI中的console文本窗口控制计算机,需要模拟终端的行为(主要是字符和特殊按键的处理规则),在具体设备(网络or桌面系统)与进程之间加入伪终端这个概念。我们在shell中输入who,可以看到我们所在的终端,比如pts/2,意思是第二个伪终端slave.
进程组
进程组就是一组进程的集合,一个signal可以发送给同一个组的所有进程。同一行用pipe连接起来的命令会产生一个进程组。
Session,Jobs
一个登录后的终端会启动一个session, 一个session有一个会话控制进程(通常是shell)。一个会话只有一个前台进程组,可以有若干个后台进程组。例如输入:
pr *.c | lpr &
产生一个后台进程组。在支持作业控制(job control)的shell,例如bash,一个进程组相当于一个Job。当job完成(结束),在新一行shell提示符显示作业状态
[1] + Done pr *.c | lpr &
前台作业与后台作业最大的区别在于信号的接收。有一些退出控制信号只会发给前台进程,而控制这些信号发送的就是session leader(通常是shell)。比如ctrl+C会发送SIGINT给前台进程组,通常结束运行,而后台进程组不受影响。
一个从telnet登录的的伪终端,如果因网络中断了,这时SIGHUP会发给所有进程组,如果我们想后台进程继续运行怎么办?在命令前输入nohup 这样在会话挂起期间后台进程仍然运行。还可以setsid改变session id,这样shell关闭也不会影响。
更多更详细的方法参加:
http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html
Reference
《Unix环境高级编程》有详细解析
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73519/showart_1090187.html |
|