[{"data":1,"prerenderedAt":134},["ShallowReactive",2],{"blog:\u002Fblog\u002F2020\u002F11\u002F11\u002Flibc-concepts-of-job-control\u002F":3},{"id":4,"title":5,"body":6,"categories":118,"comments":120,"date":121,"description":122,"draft":123,"extension":124,"legacySlug":125,"meta":126,"navigation":120,"path":127,"seo":128,"stem":129,"tags":130,"updated":132,"__hash__":133},"blog\u002Fblog\u002F2020\u002F11\u002F11\u002Flibc-concepts-of-job-control.md","【译】控制终端概念",{"type":7,"value":8,"toc":112},"minimark",[9,20,23,26,29,43,48,71,74,77,83,86,89,94,97,100,103],[10,11,12,13],"p",{},"原文:",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Flibc\u002Fmanual\u002Fhtml_node\u002FConcepts-of-Job-Control.html",[18],"nofollow","Concepts of Job Control",[10,21,22],{},"来源：",[10,24,25],{},"The GNU C Library Reference Manual, for version 2.32.",[10,27,28],{},"Copyright © 1993–2020 Free Software Foundation, Inc.",[10,30,31,32,37,38,42],{},"翻译整理: ",[14,33,36],{"href":34,"rel":35},"https:\u002F\u002Fzhizhi123.com",[18],"本站"," 译文链接:",[14,39,5],{"href":40,"rel":41},"https:\u002F\u002Fwww.zhizhi123.com\u002Fblog\u002F2020\u002F11\u002F11\u002Flibc-concepts-of-job-control\u002F",[18],"。 转载请保留原文出处和译文译者和出处。",[44,45,47],"h3",{"id":46},"_281控制终端概念","28.1控制终端概念",[10,49,50,51,55,56,61,62,55,65,70],{},"交互式shell的基本用途是从用户终端读取命令，并创建进程来执行这些命令指定的程序。这样做的方式是使用",[52,53,54],"code",{},"fork"," (参考 ",[14,57,60],{"href":58,"rel":59},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Flibc\u002Fmanual\u002Fhtml_node\u002FCreating-a-Process.html",[18],"Creating a Process",") and ",[52,63,64],{},"exec",[14,66,69],{"href":67,"rel":68},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Flibc\u002Fmanual\u002Fhtml_node\u002FExecuting-a-File.html",[18],"Executing a File",").",[10,72,73],{},"一个简单的命令可能只启动一个进程，但是一个命令使用多个进程也是很常见的。如果在shell命令中使用' | '操作符，则显式地请求几个程序在它们自己的进程中。但即使只运行一个程序，它也可以在内部使用多个进程。例如，一个编译命令，如' cc -c foo。通常使用四个进程(尽管通常在任何时候只有两个)。如果运行make，它的任务是在单独的进程中运行其他程序。",[10,75,76],{},"**属于单个命令的进程称为进程组或作业。**这就是为什么你可以同时操作它们所有。 例如，输入C-c发送信号SIGINT来终止前台进程组中的所有进程。",[10,78,79],{},[80,81,82],"strong",{},"会话是一组更大的进程。通常，来自单个登录的所有进程都属于同一个会话。",[10,84,85],{},"每个进程都属于一个进程组。当一个进程被创建时，它将成为与其父进程相同的进程组和会话的成员。您可以使用setpgid函数将其放在另一个进程组中，前提是该进程组属于同一会话。",[10,87,88],{},"将进程放入不同会话的唯一方法是使用setsid函数使其成为新会话的初始进程或会话首进程（session leader）。这也将会话首进程放到一个新的进程组中，并且您不能再次将其移出该进程组。",[10,90,91],{},[80,92,93],{},"通常，新的会话是由系统登录程序创建的，会话领导者是运行用户登录shell的进程。",[10,95,96],{},"支持作业控制的shell必须安排控制哪一个作业可以在任何时候使用终端。否则，可能会有多个作业试图同时从终端读取数据，并且搞不清楚应该由哪个进程接收用户输入的信息。为了防止这种情况发生，shell必须使用本章中描述的协议与终端驱动程序合作。",[10,98,99],{},"shell一次只允许一个进程组无限制地访问控制终端。这被称为控制终端上的前台作业。由shell管理的、正在执行而不访问终端的其他进程组称为后台作业。",[10,101,102],{},"如果后台作业需要从其控制终端读取数据，则终端驱动程序会停止该作业;如果设置了TOSTOP模式，写入也一样。用户可以通过键入SUSP字符(参见特殊字符)来停止前台作业，程序可以通过发送SIGSTOP信号来停止任何作业。shell负责注意作业何时停止，向用户通知它们，并提供机制，允许用户以交互方式继续停止的作业，并在前台和后台之间切换作业。",[10,104,105,106,111],{},"查看 ",[14,107,110],{"href":108,"rel":109},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Flibc\u002Fmanual\u002Fhtml_node\u002FAccess-to-the-Terminal.html",[18],"Access to the Terminal",", 以获取关于控制终端 I\u002FO 的更多信息.",{"title":113,"searchDepth":114,"depth":114,"links":115},"",2,[116],{"id":46,"depth":117,"text":47},3,[119],"unix",true,"2020-11-11","原文:Concepts of Job Control 来源： The GNU C Library Reference Manual, for version 2.32. Copyright © 1993–2020 Free Software Foundation, Inc. 翻译整理: 本站 译文",false,"md","libc-concepts-of-job-control",{},"\u002Fblog\u002F2020\u002F11\u002F11\u002Flibc-concepts-of-job-control",{"title":5,"description":122},"blog\u002F2020\u002F11\u002F11\u002Flibc-concepts-of-job-control",[131,119],"libc",null,"MWtADMCOFsbPpoihIqz9aHVlIJ64njKTTsTPMZJQQZs",1783807996125]