首页 > 其他分享 >20201318李兴昕第三章学习笔记

20201318李兴昕第三章学习笔记

时间:2022-10-07 11:46:14浏览次数:66  
标签:fork 第三章 李兴昕 pid 20201318 getpid printf 进程 include

第三章:Unix/Linux进程管理

知识点总结:

本章讨论了 Unix/Linux中的进程管理;阐述了多任务处理原则;介绍了进程概念;并以一个编程示例来说明多任务处理、上下文切换和进程处理的各种原则和方法

多任务处理系统支持动态进程创建、进程终止,以及通过休眠与唤醒实现进程同步、进程关系,以及以二叉树的形式实现进程家族树,从而允许父进程等待子进程终止;提供了一个具体示例来阐释进程管理函数在操作系统内核中是如何工作的;然后,解释了 Unix/Linux中各进程的来源,包括系统启动期间的初始进程、INIT进程、守护进程、登录进程以及可供用户执行命令的sh进程;

对进程的执行模式进行了讲解,以及如何通过中断、异常和系统调用从用户模式转换到内核模式;再接着,描述了用于进程管理的Unix/Linux系统调用,包括 fork, wait、exec和exit ;

阐明了父进程与子进程之间的关系,包括进程终止和父进程等待操作之间关系的详细描述;解释了如何通过IN1T进程处理孤儿进程,包括当前Linux中的subreaper进程,并通过示例演示了 subreaper进程;接着,详细介绍了如何通过exec更改进程执行映像,包括exeeve系统调用、命令行参数和环境变量;

解释了 I/O重定向和管道的 原则及方法,并通过示例展示了管道编程的方法;

进程管理中的系统调用:

fork():fork系统调用用于创建一个新进程,称为子进程,它与进行fork()调用的进程(父进程)并发运行。创建新的子进程后,两个进程都将执行fork()系统调用之后的下一条指令。子进程使用相同的PC(程序计数器),相同的CPU寄存器,相同的打开文件,这些文件在父进程中使用。
举例:

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main()
{
    // 在此指令后生成两个运行相同程序的进程
    fork();
    fork();
    fork();
    printf("Hello world!\n"); 
    return 0; 
}

实践内容:教材实例编程:C3.2.c:

代码:

#include <stdio.h>
#include <unistd.h>   //fork函数头文件
int main()
{
    int pid=fork();	// fork a child
    if (pid)
    {
        printf("PARENT %d CHILD=%d\n", getpid(), pid);
        printf("PARENT %d EXIT\n", getpid());
    }	// PARENT
     //sleep(1);	
    else
    {	
        printf("child %d start my parent«%d\n", getpid(), getppid());
        // sleep(2);	// sleep 2 seconds -> let parent die first
        printf("child %d exit my parent=%d\n", getpid(), getppid());
    }
}

在sleep()注释的情况下:
image
在sleep()删除注释的情况下:
image

实践内容:教材实例编程C3.3.c:

代码:

/************** C3.3.CS wait() and exit() ***************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>  
#include <sys/wait.h>
int main()
{
    int pid, status;
    pid = fork();
    if (pid)
    {
        printf("PARENT %d WAITS FOR CHILD %d TO DIE\n", getpid(),pid); 
        pid = wait(&status)>	// wait for ZOMBIE child process
        printf("DEAD CHILD=%d, status=0x%04x\n", pid, status);
    } // PARENT:
    else
    {
        printf("child %d dies by exit(VALUE)\n", getpid());
        exit(100);
    }
}

实践截图:
image

实践内容:教材实例编程C3.4.c:

代码:

//************** C3.4.C: Subreaper Process*****//
#include <stdio.h>
#include <unistd.h>
#include <wait.h>
#include <sys/prctl.h>
int main()
{
    int pid,r,status;
    printf("mark process %d as a subreaper\n",getpid());
    r = prctl(PR_SET_CHILD_SUBREAPER);
    pid = fork();
    if(pid)
    {
        printf("subreaper %d child = %d\n", getpid(), pid);
        while (1)
        {
            pid = wait(&status);
            if (pid > 0)
            {
                printf("subreaper %d waited a ZOMBIE=%d\n",getpid(), pid);
               
            }
            else
                    break;
        } 
    }
    else
    {
        printf("child %d parent = %d\n", getpid(), getppid());
        pid = fork();
        if (pid)
        {
            printf("child=%d start: grandchild=%d\n", getpid(),pid);
            printf("child=%d EXIT: grandchild=%d\n",getpid(),pid);
        }
        else
        {
            printf("grandchild=%d start:myparent=%d\n",getpid(),getppid());
            printf("grandcild=%d EXIT:myparent=%d\n", getpid(),getppid());
        }
    }
}

实践截图:
image

标签:fork,第三章,李兴昕,pid,20201318,getpid,printf,进程,include
From: https://www.cnblogs.com/shady545/p/16759354.html

相关文章

  • 第三章 知己知彼
    知彼知己,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必殆。《谋攻篇》前面两章其实重点是在掰扯数智化,IT研发本身的数字化其实除了DevOps这一种手段之外还有很多,比如Lo......
  • Spring Cloud:第三章:Ribbon客服端负载均衡
    负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段。理解Ribbon对于我们使用SpringCloud来讲非常的重要。它是一个基于Http和TCP的客户端负载均衡工具。......
  • nginx&http 第三章 ngx http 框架处理流程
    1.nginx 连接结构 ngx_connection_t 这个连接表示是客户端主动发起的、Nginx服务器被动接受的TCP连接,我们可以简单称其为被动连接。同时,在有些请求的处理过程中,Nginx会试......
  • 第三章练习马上就写完了
    【题目描述】抗日战争时期,我军有一个重要据点被汉奸出卖。经过密码调查,指挥部收到来自前线的一串密码,明文上显示了三个2位数。经情报员解释,每个数字代表了一个字母,即字母......
  • 第三章练习(。・∀・)ノ゙
    【题目描述】假定有5角、1角、5分、2分和1分共5种硬币,在给顾客找硬币时,一般都会尽可能地选用硬币个数最小的方法。例如,当要给某顾客找7角2分钱时,会给他一个5角,2个1角和1个......
  • 还是第三章练习
    【题目描述】从键盘输入一个字符,输出其对应的十进制ASCII码值。【输入】一个字符。【输出】所输入字符对应的十进制ASCII码值。【样例输入】a↙【样例输出】97 ......
  • 第三章练习 我又来了
    【题目描述】根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。比如G198次列车从青岛站出发时间为16:00,到达北京南站的时间为,则整个旅途所用时间为4:40。输......
  • 滴滴第三章练习
    【题目描述】小明上小学一年级了,老师已经教会了他们进行整数的 +、-、*、/、% 计算,下面老师开始出题,给出一个简单的算术表达式,从键盘任意输入两个数,每个整数之间使用空......
  • 第第三章练习
    【题目描述】已知某班有男生n1位,女生n2位,n1位男生的平均分是x分,n2位女生的平均分是y分,问全体学生的平均分是多少?【输入】4个整数x、y、n1、n2。【输出】全体学生的平......
  • 第三章练习
    题目描述】有时候人们用3~4位数字表示一个时间,比如1106表示11点零6分,530表示5点30。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。读入两个数字,第一个数字以这......