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

2. 进程链和进程扇

(1)创建进程链

  ①进程链:就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进程,这样依次往下循环,如下图所示。

  ②关键实现:判断出如果是父进程则退出,保证父进程只会创建一个子进程。如果是子进程继续创建接下来的进程再退出。

【编程实验】构建进程链

//process_link.c

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

int main(int argc, char* argv[])
{
    int counter = (argc < 2 ) ? 2 : atoi(argv[1]);

    pid_t pid;
    int i = 0;
    //构建进程链
    for(i = 1; i<counter; i++) {
        pid = fork();
        if(pid < 0 ){
            perror("fork error");
            exit(1);
        }else if(pid == 0) { //子进程继续,以进一步创建子进程形成进程链
            continue;
        }else{ //父进程退出循环
            break;
        }
    }

    printf("pid: %d, ppid = %d\n", getpid(), getppid());

    wait(0);
}

(2)创建进程扇

  ①进程扇:就是一个父进程创建出多个子进程,如下图所示。

  ②关键实现:判断出子进程则退出创建子进程的循环把创建进程的机会只留给父进程

【编程实验】构建进程扇

//process_swing.c

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

int main(int argc, char* argv[])
{
    int counter = (argc < 2 ) ? 2 : atoi(argv[1]);

    pid_t pid;
    int i = 0;
    //构建进程扇
    for(i = 1; i<counter; i++) {
        pid = fork();
        if(pid < 0 ){
            perror("fork error");
            exit(1);
        }else if(pid == 0) { //子进程则退出
            break;
        }else{ //父进程继续创建子进程
            continue;
        }
    }

    printf("pid: %d, ppid = %d\n", getpid(), getppid());

    for(i=0; i<counter; i++)
        wait(0);
}
时间: 2024-10-12 15:54:00

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

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

4. 前台进程组 (1)前台进程组 ①自动接受终端信号的组称为前台进程组 ②在终端通过ctrl+c等动作产生的信号首先被前台进程组接受. ③在shell启动的若干个进程组默认是父进程所在的组为前台进程组,其他进程组则为后台进程组 ④除非是默认,否则都要通过调度才能成为前台进程组 (2)获取/设置前台进程组ID 头文件 #include <unistd.h> 函数 pid_t tcgetpgrp(void);  //获取前台进程组ID,出错返回-1 int tcsetpgrp(int fd, p

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

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

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

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

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

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

读书笔记-APUE第三版-(9)进程关系

登录过程 终端登录 init从/etc/ttys中读取终端信息,对每个允许登录的终端,都fork子进程,并执行getty.getty打开终端设备,执行login: execle("/bin/login,"login", "-p", username, (char *)0, envp) login进行用户名密码验证,同时还会进行切换到用户主目录/修改终端设备属主&读写权限/创建进程组/setuid等动作,然后运行login shell. execl(

09.进程关系

1.终端登录 BSD终端登录 a.系统管理员创建通常名为/etc/ttys的文件,其中,每个终端设备都有一行,每一行说明设备名和传递给getty程序的参数,例如,参数之一说明了终端的波特率等. 当程序自举时,内核创建进程ID为1的进程,也就是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登录的终端设备,init调用一次fork,它所生成的子进程则执行(exec)getty程序. fork and exec init --------------

父子进程关系

1)父进程先于子进程终止: 此种情况就是我们前面所用的孤儿进程.当父进程先退出时,系统会让init进程接管子进程 . 2)子进程先于父进程终止,而父进程又没有调用wait或waitpid函数 此种情况子进程进入僵死状态,并且会一直保持下去直到系统重启.子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需.此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数. 僵死状态:一个已经终止.但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为