二十八、Linux 进程与信号---前台进程组
28.1 介绍
28.1.1 概念
- 自动接受终端信号的组称为前台进程组
- 在终端通过 ctrl + c 等动作产生的信号首先被前台进程组接受
- 在 shell 启动的若干个进程组默认是父进程所在的组为前台进程组
- 除非是默认,否则都要通过调度才能成为前台进程组
28.1.1 函数 tcgetpgrp 和 tcsetpgrp
(1)tcgetpgrp 函数---获得前台进程组ID
#include <unistd.h>
int tcgetpgrp(int fd);
- 函数功能:获得前台进程组 ID
- 返回值:若成功返回前台进程组ID,出错返回 -1
(2)tcsetpgrp 函数---设置前台进程组ID
#include <unistd.h>
int tcsetpgrp(int fd, pid_t pgrpid);
- 函数功能:使用 pgrpid 设置前台进程组ID,fd 必须引用该会话的控制终端,0 代表当前正在使用的终端
- 返回值:成功返回 0,出错返回 -1
28.2 例子
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> int main(void)
{
pid_t group1,group2; //创建进程组1,父进程作为组长进程
setpgid(getpid(), getpid());
group1 = getpgid(getpid()); pid_t pid;
int i = ;
for(; i < ; i++) {
pid = fork();
if(pid < ) {
perror("fork error");
exit();
} else if(pid > ) {
if(i == ) {
setpgid(pid, pid);
group2 = getpgid(pid);
} if(i == ) {
setpgid(pid, group2);
} if(i == ) {
setpgid(pid, group1);
}
} else { if(i == ) {
setpgid(getpid(), getpid());
group2 = getpgid(getpid());
} if(i == ) {
setpgid(getpid(), group2);
} if(i == ) {
setpgid(getpid(), group1);
} break;
}
} printf("pid: %d, ppid: %d, pgid: %d\n", getpid(), getppid(), getpgid());
pause(); exit();
}
编译执行
查询下进程:
按下 ctrl-c 停止运行的进程
然后再查看进程:
8956 和 8959 为默认进程组 group1,执行完 ctrl +c 后关闭,但是 group2 没有关闭,可以发现进程组默认是父进程那一组
进行设置 group2 为前台进程组
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h> int main(void)
{
pid_t group1,group2; //创建进程组1,父进程作为组长进程
setpgid(getpid(), getpid());
group1 = getpgid(getpid()); pid_t pid;
int i = ;
for(; i < ; i++) {
pid = fork();
if(pid < ) {
perror("fork error");
exit();
} else if(pid > ) {
if(i == ) {
setpgid(pid, pid);
group2 = getpgid(pid);
} if(i == ) {
setpgid(pid, group2); //将 group2 设置为前台进程组
tcsetpgrp(, group2);
} if(i == ) {
setpgid(pid, group1);
}
} else { if(i == ) {
setpgid(getpid(), getpid());
group2 = getpgid(getpid());
} if(i == ) {
setpgid(getpid(), group2); tcsetpgrp(, group2);
} if(i == ) {
setpgid(getpid(), group1);
} break;
}
} printf("pid: %d, ppid: %d, pgid: %d\n", getpid(), getppid(), getpgid());
pause(); exit();
}
二十八、Linux 进程与信号---前台进程组的更多相关文章
- 二十、Linux 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程
23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...
- 二十七、Linux 进程与信号---进程组和组长进程
27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...
- 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...
- 二十一、Linux 进程与信号---进程资源限制
21.1 进程资源限制 在操作系统中,我们能够通过函数getrlimit().setrlimit()分别获得.设置每个进程能够创建的各种系统资源的限制使用量. 21.1.1 函数 #include & ...
- [转帖]十二 个经典 Linux 进程管理命令介绍
https://www.cnblogs.com/swordxia/p/4550825.html 接了 http referer 头 没法显示图片 可以去原始blog 里面去查看. 随笔- 109 ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- centos7破解安装jira6.3.6(含Agile)
应用场景:JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪 和敏捷管理等工作领域. 安装环境:centos7.3虚拟机 ...
- RSA签名验证
/// <summary> /// 验证签名 /// </summary> /// <param name="content">待签名字符串&l ...
- Django(二十)model中的 class Meta
https://www.cnblogs.com/tongchengbin/p/7670927.html class Main(models.Model): img = models.CharField ...
- 第十一篇- 实现APK打开文件功能
MainActivity.java package com.example.aimee.aimeetest3; import android.content.Context; import andro ...
- Spring MVC 架构的java web工程如何添加登录过滤器
发布到外网的web工程必须添加登录过滤器来阻挡一些非法的请求,即只有登录的用户才能对web工程进行请求,否则无论请求什么资源都需要调整到登录页面进行登录操作.这时就需要用到过滤器,其实非常简单,只需要 ...
- springmvc跨域上传文件问题
把以下文件放到webapps的root文件夹下: 1.clientaccesspolicy.xml <?xml version="1.0" encoding="ut ...
- Good Bye 2018 D. New Year and the Permutation Concatenation
传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题意: 求 n 的所有全排列组成的序列中连续的 n 个数加和为 n*(n+1)/2 的 ...
- 桌面面板和内部窗体JDeskPane、JInternalFrame
桌面面板和内部窗体JDeskPane.JInternalFrame,内部窗体必须在桌面面板里. import javax.swing.*; import java.awt.*; public clas ...
- Python之包
包是一种通过使用'.模块名'来组织python模块名称空间的方式.创建包是为了用文件夹将文件/模块组织起来,创建包的目的不是为了运行,而是为了被导入使用.包的本质就是一个文件,其功能是将文件组织起来, ...
- Visual Studio 2015中设计UML类图
1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是 ...