Linux下的终端和作业控制

本文详细介绍了Linux下的作业控制,包括进程组、作业和会话的概念,以及它们之间的关系。重点阐述了如何查看和控制后台作业,如使用jobs、bg、fg命令。同时,深入探讨了终端的基本概念,讲解了终端登录过程,并提到了终端设备的输入输出队列。最后,文章讲解了作业控制的基本概念,涉及与作业控制相关的信号处理,如SIGTTIN、SIGTSTP和SIGCONT信号的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程间的关系

进程间的三种关系:进程组、作业和会话。
1、进程组
每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程(该组进程的第一个,组成员ID等于组长ID)。组长进程的标识是,其进程组ID等于其进程ID。

组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。

2、作业
1>Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制

2>作业与进程组的区别:
如果作业中的某个进程又创建了子进程,则子进程不属于作业,但是却属于进程组。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。(一般情况进程组合作业不做区别)

查看后台作业:jobs
将前台作业提至后台:bg 1(作业号) 先要contrl C终止后台作业
将后台作业提至前台:fg 1(作业号)

3>实例:fork一个子进程,如果父进程先退出,作业结束,进程组还在,shell成为前台作业,子进程成为后台进程组,ctrl C终止不了。

 8 #include<stdio.h>
  9 #include<unistd.h>
 10 #include<stdlib.h>
 11 
 12 int main()
 13 {
 14     pid_t pid = fork();
 15     while(1)
 16     {
 17         if(pid == -1)
 18         {
 19             perror("fork error");
 20             return -1;
 21         }
 22         else if(pid > 0)//father
 23         {
 24             printf("i am father\n");
 25             exit(1);//父进程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值