来源:
The GNU C Library Reference Manual, for version 2.32.
Copyright © 1993–2020 Free Software Foundation, Inc.
翻译整理: 陈进涛 译文链接:【译】控制终端概念。 转载请保留原文出处和译文译者和出处。
28.1控制终端概念
交互式shell的基本用途是从用户终端读取命令,并创建进程来执行这些命令指定的程序。这样做的方式是使用fork
(参考 Creating a Process) and exec
(参考 Executing a File).
一个简单的命令可能只启动一个进程,但是一个命令使用多个进程也是很常见的。如果在shell命令中使用’ | ‘操作符,则显式地请求几个程序在它们自己的进程中。但即使只运行一个程序,它也可以在内部使用多个进程。例如,一个编译命令,如’ cc -c foo。通常使用四个进程(尽管通常在任何时候只有两个)。如果运行make,它的任务是在单独的进程中运行其他程序。
属于单个命令的进程称为进程组或作业。这就是为什么你可以同时操作它们所有。 例如,输入C-c发送信号SIGINT来终止前台进程组中的所有进程。
会话是一组更大的进程。通常,来自单个登录的所有进程都属于同一个会话。
每个进程都属于一个进程组。当一个进程被创建时,它将成为与其父进程相同的进程组和会话的成员。您可以使用setpgid函数将其放在另一个进程组中,前提是该进程组属于同一会话。
将进程放入不同会话的唯一方法是使用setsid函数使其成为新会话的初始进程或会话首进程(session leader)。这也将会话首进程放到一个新的进程组中,并且您不能再次将其移出该进程组。
通常,新的会话是由系统登录程序创建的,会话领导者是运行用户登录shell的进程。
支持作业控制的shell必须安排控制哪一个作业可以在任何时候使用终端。否则,可能会有多个作业试图同时从终端读取数据,并且搞不清楚应该由哪个进程接收用户输入的信息。为了防止这种情况发生,shell必须使用本章中描述的协议与终端驱动程序合作。
shell一次只允许一个进程组无限制地访问控制终端。这被称为控制终端上的前台作业。由shell管理的、正在执行而不访问终端的其他进程组称为后台作业。
如果后台作业需要从其控制终端读取数据,则终端驱动程序会停止该作业;如果设置了TOSTOP模式,写入也一样。用户可以通过键入SUSP字符(参见特殊字符)来停止前台作业,程序可以通过发送SIGSTOP信号来停止任何作业。shell负责注意作业何时停止,向用户通知它们,并提供机制,允许用户以交互方式继续停止的作业,并在前台和后台之间切换作业。
查看 Access to the Terminal, 以获取关于控制终端 I/O 的更多信息.