终端登录
BSD终端登录
- init以空环境exec getty程序
- getty对终端设备调用open函数,以读、写方式将终端打开
- 以类似于下列的方式调用login程序
linux 终端登录
和BSD登录类似,主要区别在于说明终端配置的方式。
linux系统,用/etc/init/tty1.conf文件
网络登录
BSD网络登录
- 以下是执行telnet服务进程时调用的进程序列:
- init执行shell脚本/etc/rc从而启动守护进程inetd,一旦该shell脚本终止,inetd的父进程就变成init。
Linux网络登录
和BSD网络登录类似,但使用扩展的因特网服务守护进程xinetd。
进程组
- 是一个或多个进程的集合,每个进程组有一个唯一的进程组id.
- 每个进程组有一个组长进程,组长进程的进程组ID等于其进程ID
- 进程组的生命期为从进程组创建开始到其中最后一个进程离开为止
#include <unistd.h>
#include <sys/types.h>
/*set/get process group*/
gid_t getegid(void);
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(pid_t pid); /* BSD version */
int setpgrp(void); /* System V version */
int setpgrp(pid_t pid, pid_t pgid); /* BSD version */
会话
- 会话是一个或多个进程组的集合
#include <unistd.h>
/*creates a session and sets the process group ID
*/
pid_t setsid(void);
/* get session ID*/
pid_t getsid(pid_t pid);
控制终端
- 进程组、会话和控制终端
- 一个会话可以有一个控制终端
- 控制进程
- 一个前台进程组和多个后台进程组
函数tcgetpgrp、tcsetpgrp和tcgetsid
#include <unistd.h>
/*get terminal foreground process group*/
/*The function tcgetpgrp() returns the process group ID of the foreground process group on the terminal associated to fd, which must be the controlling terminal of the calling process*/
pid_t tcgetpgrp(int fd);
/*set terminal foreground process group*/
int tcsetpgrp(int fd, pid_t pgrp);
作业控制
- 需要一个支持作业控制的shell以用由作业控制提供的功能
- 有3个特殊字符可使终端驱动程序产生信号,并将他们发送至前台进程组