linux前台进程组,二十八、Linux 进程与信号---前台进程组

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 例子

cd72a11266cbc9ba52e03623d1f97d59.png

#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();

}

编译执行

6d8946230f16ae509604add3ed8a4772.png

查询下进程:

3435abf4b68898b654e4e71f61da46b7.png

按下 ctrl-c 停止运行的进程

然后再查看进程:

a06d3d1b2d6d006736ff62c6e58482e9.png

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 & ...

&lbrack;转帖&rsqb;十二 个经典 Linux 进程管理命令介绍

https://www.cnblogs.com/swordxia/p/4550825.html 接了 http referer 头 没法显示图片 可以去原始blog 里面去查看.   随笔- 109  ...

Bootstrap &lt&semi;基础二十八&gt&semi;列表组

列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素

  • 添加 class .list-group. 向
  • 添加 cl ...

    Web 前端开发人员和设计师必读文章推荐【系列二十八】

    2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

    随机推荐

    erlang 故障排查工具

    系统级别perf top, dstat -tam, vtune 都能很好分析beam 瓶颈,本文主要erlang 级别排查: 1. 反编译 确认线上运行代码是否正确,reltools没掌握好,升级偶尔 ...

    388A &Tab; Fox and Box Accumulation

    一开始贪心策略想错了! #include #include using namespace std; ]; int main() { in ...

    html image -- data&colon;image&sol;png&semi;base64

    1,  data:image/png;base64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值