Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27723
  • 博文数量: 9
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 10:50
文章分类
文章存档

2011年(1)

2008年(8)

我的朋友
最近访客

分类: LINUX

2008-07-23 21:48:21

本文总结了几个概念: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环境高级编程》有详细解析

 

阅读(1015) | 评论(0) | 转发(0) |
0

上一篇:总结一下串口

下一篇:linux线程之NPTL

给主人留下些什么吧!~~