当用户自举时,会创建init进程,进程号为1. init的创建使系统进入多用户状态。对于每个允许登录的设备,intit进程用一次fork,它所生成
的子进程则执行exec(getty)程序。
然后login程序将执行以下操作 :
1、将当前的工作目录设为用户的起始目录(chdir)
2、调用chown改变终端的用户所有权,使登录用户成为它的所有者。
3、将该终端设备的访问权限设为读和写。
4、调用setgid和initgroups设置进程的组ID
5、用login所得到的所有信息初使化环境:起始目录(HOME)、shell(SHELL)、用户名(USER和LOGNAME),以及一个系统默认路径(PATH)。
6、login进程改变为登录用户的用户ID(setuid)并调用该用户的登录shell。如下
execl("/bin/sh","-sh",(char*)0)。
进程组:
进程组是多个进程的集合。
每个进程组有一个组长进程,组长进程的ID和该进程组的ID相同。
setgpid(pid_t pid,pit_t pgid)函数pid进程的进程组ID设置为pgid。如果这两个数相等,则由pid指定的进程变成组长进程,当然进程只有给自己或者其子进程指定组长进程。如果pid=0,则使用调用者的ID。如果pgid==0,则将pid指定的进程ID作为组长ID。
在大多数的作业控制shell中,在fork
会话:
会话是多个进程或者进程组的集合。