28.1 介绍
28.1.1 概念
自动接受终端信号的组称为前台进程组
在终端通过 ctrl + c 等动作产生的信号首先被前台进程组接受
在 shell 启动的若干个进程组默认是父进程所在的组为前台进程组
除非是默认,否则都要通过调度才能成为前台进程组
28.1.1 函数 tcgetpgrp 和 tcsetpgrp
(1)tcgetpgrp 函数---获得前台进程组ID
#include
int tcgetpgrp(int fd);
函数功能:获得前台进程组 ID
返回值:若成功返回前台进程组ID,出错返回 -1
(2)tcsetpgrp 函数---设置前台进程组ID
#include
int tcsetpgrp(int fd, pid_t pgrpid);
函数功能:使用 pgrpid 设置前台进程组ID,fd 必须引用该会话的控制终端,0 代表当前正在使用的终端
返回值:成功返回 0,出错返回 -1
28.2 例子
#include
#include
#include
#include
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
#include
#include
#include
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 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include 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 <;基础二十八>;列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素
- 添加 class .list-group. 向
- 添加 cl ...
Web 前端开发人员和设计师必读文章推荐【系列二十八】
2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
erlang 故障排查工具
系统级别perf top, dstat -tam, vtune 都能很好分析beam 瓶颈,本文主要erlang 级别排查: 1. 反编译 确认线上运行代码是否正确,reltools没掌握好,升级偶尔 ...
388A 	 Fox and Box Accumulation
一开始贪心策略想错了! #include #include using namespace std; ]; int main() { in ...
html image -- data:image/png;base64
1, data:image/png;base64