如果一个会话有控制终端,那么该会话就有一个前台进程组。此时在终端中的输入以及终端产生的信号默认都发送给前台进程组中的所有进程。

前台进程组是可以通过程序进行设置的。在同一个会话中,调用 tcsetpgrp 函数可以设置某个进程组为前台进程组。

1. 目标

任务1: 在 bash 中启动你的进程,然后将前台进程组设置为 bash 所在的进程组。
任务2:关闭启动你进程的终端,查看你的进程能收到什么信号。

2. 思路

在任务 1 中,首先获取 bash 进程的进程组 id,而 bash 进程又是进程组组长,所以它的进程组 id 就相当于 bash 进程 id.

任务 2 中,你的进程可以收到 SIGHUP 信号,所以捕获些信号即可(有关信号的知识请参考专题五)。

3. 程序清单

  • 代码
// ct.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>void handler(int sig) {if (sig == SIGHUP) {int fd = open("tmp", O_WRONLY | O_CREAT, 0664);write(fd, "hello SIGHUP\n", 32);exit(0);}
}void print() {pid_t pid, sid, pgid, tpgid;pid = getpid();sid = getsid(pid);pgid = getpgid(pid);tpgid = tcgetpgrp(0);if (tpgid < 0) {perror("tcgetpgrp");}printf("pid = %d, pgid = %d, sid = %d, tpgid = %d\n", pid, pgid, sid, tpgid);
}
int main(int argc, char* argv[]) {signal(SIGHUP, handler);// 打印当前进程 id,组 id,会话 id,当前会话中的前台进程组 id.print();// 将前台进程组设置为 bash 进程组的 id.tcsetpgrp(0, getppid());print();while(1) sleep(1);return 0;
}
  • 编译和运行
$ gcc ct.c -o ct
$ ./ct
  • 运行结果


图1 运行结果

启动你的程序后,无论键入 CTRL C、CTRL \ 还是 CTRL Z 都没反应了。程序第一行打印的是未设置前台进程组前的结果,第二行打印是设置后的结果。可以看到设置后的前台进程组 id = 2816.

直接关闭终端,当前文件夹下会生成 tmp 文件,内容就是在信号处理函数里定稿的数据,如图2。


图2 关闭终端,进程收到 SIGHUP 信号

4. 总结

  • 掌握如何设置前台进程组
  • 当直接关闭控制终端后,进程会收到 SIGHUP 信号

练习:使用 kill 将启动 ct 程序的 bash 进程杀死,看看有什么效果。(提示:ct 进程并没有结束,因为没有收到 SIGHUP 信号)

70-设置前台进程组相关推荐

  1. 前台进程组、后台进程组

    一.前台进程组.后台进程组 cat | cat & cat | cat | cat 输出结果: 二.主要函数应用 1. tcgetpgrp函数原型: #include <unistd.h ...

  2. 安全设置Windows组策略 有效阻止黑客

    安全设置Windows组策略 有效阻止黑客在本篇技术指南中,将概要介绍你如何修改最重要的组策略安全设置. 你可以在采用Windows XP.2000和Server 2003操作系统的本地计算机上使用这 ...

  3. 怎么将计算机网络设置家庭,“windows无法在此计算机上设置家庭组”问题如何解决...

    windows无法在此计算机上设置家庭组,这个问题使用win7系统的朋友应该都比较了解了,我们这里也就不做过多的介绍,直接将解决该问题的方法分享给大家: 首先,导致windows无法在此计算机上设置家 ...

  4. 简述台式计算机创建家庭组的步骤,如何创建和设置家庭组

    如何创建和设置家庭组 导语:让我们来一起了解一下如何创建和设置家庭组.以下是小编整理的有关电脑技巧的知识,希望对您有所帮助. (1)请确保已经建立了局域网,并且所有计算机都已经正确连接到该局域网,整个 ...

  5. (78)Vivado设置时钟组约束

    (78)Vivado设置时钟组约束 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado设置时钟组约束 5)技术交流 6)参考资料 2 时序约束引言 1)什么是 ...

  6. OpenShift 4之设置用户/组对项目的访问权限

    OpenShift 4之设置用户/组对项目的访问权限 环境与目标 用户 组 项目 目标 实现 创建资源 关联用户和组 设置组权限 验证 环境与目标 假设OpenShift环境中有以下User.Grou ...

  7. [微云助手/微小云怎么用]如何设置群组群发

    如何设置群组群发 个人版 1:点击登录的机器人 2:选择群组助理,点击群组群发 3:标题用来区分不同的群发,系统只会发送设定的图片或者文字内容,不会发送标题 4:为了防止被封号,不要设置超过3个群发内 ...

  8. 家庭计算机如何共享打印机共享,win7系统怎么设置家庭组共享打印机

    随着电脑的使用率越来越高,我们有时候可能会遇到对win7系统怎么设置家庭组共享打印机进行设置,接下来给大家带来win7系统怎么设置家庭组共享打印机的详细步骤: 一.创建和加入家庭组 1.在连接了打印机 ...

  9. Excel画图(多组数据设置多组图例、设置x轴、设置次坐标轴)

    Excel画图(多组数据设置多组图例.设置x轴.设置次坐标轴) 1.为多组数据设置多组图例.x轴 引言 在用Excel画图过程中,往往一张图中有多组数据.那么如何设置x轴数据.如何设置多组图例呢? 正 ...

最新文章

  1. jquery dataTable的学习
  2. 计算机辅助教学 林筑英,视频教学制作技巧.doc
  3. unix入门经典_程序员大神们的经典编程语录
  4. JS操作保存cookie(转载他人)
  5. Python学习之路day02——007字典的嵌套
  6. 高通利用DMCA通知迫使GitHub关闭100+代码库
  7. 如何在 Windows 下像 Mac 一样优雅开发
  8. simulink模型动静态测试
  9. OneData指标体系
  10. 机器学习方向上还有没有创新点呢?
  11. 解决Mac电脑无法读写ntfs硬盘分区的方法以及磁盘读写的简单方法
  12. 计算机桌面空白图标如何删除,桌面出现空白图标的删除方法
  13. HCIA—网络基本知识—双绞线(文字 + 图解)
  14. pacman 查询_pacman常用命令
  15. WinCC RT Adv 项目下载与自动运行
  16. mysql_dc.ncf_my live PC / ThinkCentre M920x Tiny / ThinkStation P330 Tiny
  17. Monitor模式和AP模式下获取WiFi的CSI信号
  18. 一个男网友娶到一个女网友后在洞房发生的事情
  19. 【Fastlio2 SLAM算法实现】
  20. QML基础:锚anchors

热门文章

  1. 《电磁学》学习笔记3——电感应强度
  2. 移动运营商ipcc文件_IPCC下载
  3. KFC简易点餐收银模拟系统
  4. 计算机毕业设计(附源码)python医院病房管理系统
  5. 2008年1月8日,完美时空首部战争史诗大作《赤壁》将开启正式内测。
  6. c语言initializers,too many initializers
  7. 工业互联网网络体系安全防护研究
  8. 携程网的flex案例
  9. C语言写炸弹人小游戏
  10. 力扣练习——31 有效的井字游戏