一、终端
1、什么是终端?
在 Linux 系统中,用户通过终端登录到系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端,进程中,控制终端是保存在 PCB 中的信息,而 fork 会复制
PCB 中的信息,因此右 shell 进程启动的其他进程的控制终端也是这个终端。在默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出到显示器上。
Alt + Ctrl + F1、F2、F3、F4、F5、F6 字符终端 pts 指伪终端
Alt + F7 图形终端
SSH、Telnet 网络终端
2、终端的启动流程
一个 Linux 系统启动如下步骤:
init ------> fork ---------->exec --------->gettty --------> 用户输入账号 ------------>login ---------->exec --------->bash
3、ttyname 函数
#include <unistd.h>
char *ttyname(int fd);
返回值:
成功返回终端名; 失败:返回NULL,设置 errno
二、进程组
1、概念
进程组,也称为作业。
2、特性
当父进程,创建子进程的时候,默认子进程与父进程属于同一组进程。进程组 ID 等于 第一个进程 ID(组长进程)。所以,组长进程标识:其进程组 ID == 其进程 ID
可以使用 kill - SIGKILL + 进程组 ID(负的) 来将整个进程组内的进程全部杀死。
组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。
进程组生存期:进程组创建到最后一个进程离开(终止或转移另一个进程组)
一个进程可以为自己或子进程设置进程组 ID
3、进程组操作函数
#include <unistd.h>
pid_t getpgrp(void); /* POSIX.1 version */
获取当前进程的进程组 ID 。
#include <unistd.h>
pid_t getpgid(pid_t pid);
获取指定进程的进程