第7章 进程关系(4)_前台进程组

4. 前台进程组

(1)前台进程组

  ①自动接受终端信号的组称为前台进程组

  ②在终端通过ctrl+c等动作产生的信号首先被前台进程组接受。

  ③在shell启动的若干个进程组默认是父进程所在的组为前台进程组,其他进程组则为后台进程组

  ④除非是默认,否则都要通过调度才能成为前台进程组

(2)获取/设置前台进程组ID


头文件


#include <unistd.h>


函数


pid_t tcgetpgrp(void);  //获取前台进程组ID,出错返回-1

int tcsetpgrp(int fd, pid_t pgrpid); //设置前台进程组ID,成功返回0,出错返回-1


功能


获取或设置前台进程组ID


参数


fd:必须引用该会话的控制终端0代表当前正在使用的终端

【编程实验】设置前台进程组

//process_foregroup.c

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

//测试前台进程组
//分为前台进程组和后台进程组,按ctrl+c时前台进程组将被kill。
int main(void)
{
    pid_t group1, group2;
    //创建进程组1,父进程作为组长进程
    setpgid(getpid(), getpid());
    group1 = getpgid(getpid());

    pid_t pid;
    int i = 0;

    for(; i< 3; i++){
        pid = fork();
        if(pid < 0){
            perror("fork error");
            exit(1);
        }else if(pid > 0){ //parent process
            if(i == 0 ){
                 //创建进程组2
                 setpgid(pid, pid);
                 group2 = getpgid(pid);
                 //将group2设置为前台进程组
                 tcsetpgrp(0, group2);
            }
            if(i == 1){
                //将第2个子进程加入到group2
                setpgid(pid, group2);
            }
            if(i == 2){
                //第3个子进程加入group1
                setpgid(pid, group1);
            }
        }else{ //child process
            if(i == 0){
                 //创建进程组2
                 setpgid(getpid(), getpid());
                 group2 = getpgid(getpid());
                 //将group2设置为前台进程组
                 tcsetpgrp(0, group2);
            }
            if(i == 1){
                //将第2个子进程加入到group2
                setpgid(getpid(), group2);
            }
            if(i == 2){
                //第3个子进程加入group1
                setpgid(getpid(), group1);
            }

            break;  //进程扇,子进程须退出
        }
    }

    printf("pid: %d, ppid: %d, pgid: %d\n",
            getpid(), getppid(), getpgid(0));

    pause();

    return 0;
}
时间: 2024-10-13 03:45:28

第7章 进程关系(4)_前台进程组的相关文章

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则

apue学习笔记(第九章 进程关系)

本章将详细地说明进程组以及POSIX.1引入的会话的概念.还将介绍登录shell和所有从登录shell启动的进程之间的关系 终端登录 BSD终端登录.系统管理者创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,用来说明设备名和传到getty程序的参数. 当系统自举时,内核创建进程ID为1的进程(init进程).init进程读取文件/etc/ttys,对每一个允许登录的终端设备调用一次fork,它所生成的子进程则exec getty程序,如下图所示: getty对终端设备调用open

第9章进程关系总结

1 进程组与进程组ID 获取进程组ID pid_t getpgrp() pid_t getpgid(pid_t pid) 设置进程组ID int setpgid(pid_t pid,pid_t pgid) 2 会话 一次登录期间产生的所有进程组都属于同一个会话,会话是进程组的集合 通过setsid可以创建会话,调用setsid的进程不能是进程组的组长进程 1)该进程将成为新会话首进程 2)该进程成为新进程组的组长进程 3)该进程没有控制终端 为了保证调用setsid函数的进程不是组长进程,一般调

第7章 进程关系(2)_进程链和进程扇

2. 进程链和进程扇 (1)创建进程链 ①进程链:就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进程,这样依次往下循环,如下图所示. ②关键实现:判断出如果是父进程则退出,保证父进程只会创建一个子进程.如果是子进程继续创建接下来的进程再退出. [编程实验]构建进程链 //process_link.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, c

第7章 进程关系(1)_守护、孤儿和僵尸进程

1. 守护.孤儿和僵尸进程 (1)守护进程 ①守护进程(daemon)是生存期长的一种进程.它们常常在系统引导装入时启动,在系统关闭时终止. ②所有守护进程都以超级用户(用户ID为0)的优先权运行. ③守护进程没有控制终端 ④守护进程的父进程都是init进程(1号进程). (2)孤儿进程:父进程先结束,子进程就成为孤儿进程,会由1号进程(init进程)领养. [编程实验]产生孤儿进程 //process_orphen.c #include <unistd.h> #include <std

第7章 进程关系(5)_贯穿案例2:mini shell(2)

5. 贯穿案例2:mini shell(2) (1)己经完成的功能:pwd.cd.exit命令 (2)阶段性目标: ①env.export.echo及其他命令 ②标准输入.输出重定向">"."<".">>" ③设置后台进程 [编程实验]mini  shell //job.h //job.c //mshell.c

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改

第十三章 进程、线程类的实现

                                        第十三章   进程.线程类的实现         多线程是指在一个进程内可以同时运行多个任务,每个任务由一个单独的线程来完成.线程是进程运行的基本单位,一个进程中可以同时运行多个线程.如果程序被设置为多线程方式,可以提高程序运行的效率和处理速度. 多个线程共用一个进程的资源:进程的调度.切换是在10ms的"时钟滴答"定时中断程序里进行.如果一个线程获得CPU,那么在下一个Tick到来前:是不可能被切换出去的

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系