进程控制【Linux】

创建一批子进程

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define N 5void runChild()
{int cnt = 10;while (cnt != 0){printf("i am a child : %d , ppid:%d\n", getpid(), getppid());sleep(1);cnt--;}
}int main()
{int i = 0;for (; i < N; i++){pid_t id = fork();if (id == 0){//子进程runChild();exit(0);}//父进程//父进程继续循环}sleep(1000);return 0;
}

进程终止

进程退出只有三种情况:
代码运行完毕,结果正确。
代码运行完毕,结果不正确
代码异常终止(进程崩溃)

代码异常,本质可能就是代码没有跑完
此时进程的退出码无意义,我们不关心退出码

代码是否正确,统一会采用进程的退出码来进行判断

在这里插入图片描述

查看该进程的进程退出码
$?:保存的是最近一次进程退出的时候的退出码

[cxq@iZ7xviiy0goapxtblgih6oZ lesson15]$ echo $?

在这里插入图片描述

查看错误码
在这里插入图片描述

在这里插入图片描述

errno

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>int main() 
{int ret = 0;char *p = (char*)malloc(1000 * 1000 * 1000 * 4);if (p == NULL) {//errno 返回的是错误码 ,strerror可以知道错误原因printf("malloc error, %d %s\n", errno, strerror(errno));ret = errno;} else {printf("malloc success\n");}return ret;
}

在这里插入图片描述

进程出现异常,本质是我们的进程收到了对应的信号
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

exit与return的区别
exit在任意地方被调用,都表示调用进程直接退出
return只表示当前函数返回,还会继续向后运行

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void show()
{printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");exit(13);//exit在任意地方被调用,都表示调用进程直接退出,如果此时换成return,return只表示当前函数返回,还会继续向后运行printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");
}int main()
{show();printf("hello Linux\n");return 12;
}

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void show()
{printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");return ;//return只表示当前函数返回,还会继续向后运行exit(13);//exit在任意地方被调用,都表示调用进程直接退出printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");
}int main()
{show();printf("hello Linux\n");return 12;
}

在这里插入图片描述
_exit :

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void show()
{printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");printf("hello show\n");_exit(14);printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");printf("end show\n");
}int main()
{show();printf("hello Linux\n");return 12;
}

在这里插入图片描述
_exit 与exit的区别

使用exit函数退出进程也是我们常用的方法,exit函数可以在代码中的任何地方退出进程,并且exit函数在退出进程前会做一系列工作

1、执行用户通过atexit或on_exit定义的清理函数。
2、关闭所有打开的流,所有的缓存数据均被写入。
3、调用_exit函数终止进程。
在这里插入图片描述

在这里插入图片描述

_exit()是系统调用接口,exit()是库函数
当把exit改成_exit时,使用_exit终止进程,不会刷新缓冲区的数据,所以缓冲区当中的数据将不会被输出,就不会看到you can see me 了
但是exit在终止进程之前,会冲刷缓冲区,将缓冲区的数据输出

printf一定是先把数据写入缓冲区中,合适的时候,再进行刷这个缓冲区,缓冲区绝对不在内核中,在用户区

进程等待

进程等待:通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能

1、子进程退出,父进程如果不读取子进程的退出信息,子进程就会变成僵尸进程,进而造成内存泄漏
2、进程一旦变成僵尸进程,那么就算是kill -9命令也无法将其杀死,因为谁也无法杀死一个已经死去的进程
3、对于一个进程来说,最关心自己的就是其父进程,因为父进程需要知道自己派给子进程的任务完成的如何
4、父进程需要通过进程等待的方式,回收子进程资源,获取子进程的退出信息

父进程通过调用wait/waitpid进行僵尸进程的回收问题

在这里插入图片描述
监控脚本

while :; do ps ajx |head -1 && ps ajx | grep testWait | grep -v grep  ; sleep 1 ; echo "------------"  ; done

在这里插入图片描述

wait是等待任意一个子进程退出

如果是多个子进程僵尸,如何利用wait回收?

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(cnt)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {19   for( int i =0 ; i < N ;i ++ )20   {21     pid_t id  =  fork();22     if( id ==0  )              23     {                   24       //子进程25       Runchild ();26       exit(0);    27     }                                                                                                                                                      28     //父进程      29     printf("create child process: %d success\n", id);30   }                                                  31   sleep(10);                                         32   //等待                                             33   for( int i = 0 ; i < N  ; i++ )34   {                              35       pid_t id   =  wait(NULL);  36      if( id>0 )                  37      {                         38        printf("wait %d success\n", id);39      }  40 41   }42 43 sleep(5);44   return 0 ;45 }

在这里插入图片描述

如果父进程在等待子进程,如果一个子进程或多个子进程不退出 ,父进程会在调用wait时,父进程就一直拿不到子进程的pid , 父进程会一直等待子进程退出,父进程这种状态叫阻塞等待

 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(1)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {19   for( int i =0 ; i < N ;i ++ )20   {21     pid_t id  =  fork();22     if( id ==0  )23     {24       //子进程25       Runchild ();26       exit(0);27     }28     //父进程 29     printf("create child process: %d success\n", id);30   }31 //  sleep(10);                                                                                                                                             32   //等待33   for( int i = 0 ; i < N  ; i++ )34   {35       pid_t id   =  wait(NULL);36      if( id>0 )37      {38        printf("wait %d success\n", id);39      }40 41   }42 43 sleep(5);44   return 0 ;45 }

waitpid

等待指定子进程或任意子进程

在这里插入图片描述

waitpid的返回值:
1、等待成功返回被等待进程的pid。
2、如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0。
3、如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。

pid:待等待子进程的pid,若设置为-1,则等待任意子进程
status:输出型参数(通过指针,把函数内部的数据带出来)
获取子进程的退出状态,不关心可设置为NULL

status:操作系统会去找对应id的子进程,并且等待该子进程,如果该子进程退出 ,操作系统会将子进程的退出信息拷贝到status指针所指向的变量当中

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(1)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {45   pid_t id = fork() ;46   if(id <0)47   {48     perror("fork");49     return 1 ;50   }51   else if( id == 0 )52   {53    //child 54    55    int cnt =5 ;56    while(cnt)57    {58      printf("I am a child ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);59      cnt -- ;60      sleep(1);61    }62      exit(1);63   }64    else // parent 65   {66     int cnt =10  ;67     while(cnt )68     {69      printf("I am a parent ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);                                                                       70      cnt -- ;71      sleep(1); 72     }73     // pid_t ret = wait(NULL);74      75    int status =0 ;//输出型参数76    //操作系统会去找对应id的子进程,并且等待该子进程,如果该子进程退出 ,操作系统会将子进程的退出信息拷贝到status指针所指向的变量当中77    pid_t  ret = waitpid( id, &status , 0 );78 79      //等待成功80      if( ret ==id ) //id是子进程的pid81      {82        //status存放的是子进程的退出信息83        printf("wait success,ret:%d, status: %d\n", ret, status);84      }85 sleep(5);86 87 88   }89   return 0 ;90 }

在这里插入图片描述
为什么status是256 ?
在子进程中 ,exit函数里面,我们设置的是1
在这里插入图片描述

退出码设置的是1 ,也就是00000001,00000001就是256

子进程退出,一共会有3种退出场景
1、代码运行完毕,结果正确
2、代码运行完毕,结果不正确
3、代码异常终止

父进程等待,需要获得子进程退出的哪些信息?
1、子进程代码是否异常
2、如果没有异常,通过退出码判断来结果是否正确
不同的退出码表示不同的出错原因

status是一个整型变量,但status不能简单的当作整型来看待,status的不同比特位所代表的信息不同,具体细节如下(只研究status低16比特位)

在这里插入图片描述

 1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(1)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {45   pid_t id = fork() ;46   if(id <0)47   {48     perror("fork");49     return 1 ;50   }51   else if( id == 0 )                                                                                                                                                                       52   {53    //child 54    55    int cnt =5 ;56    while(cnt)57    {58      printf("I am a child ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);59      cnt -- ;60      sleep(1);61    }62      exit(1);63   }64    else // parent 65   {66     int cnt =10  ;67     while(cnt )68     {69      printf("I am a parent ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);70      cnt -- ;71      sleep(1); 72     }73     // pid_t ret = wait(NULL);74      75    int status =0 ;//输出型参数76    //操作系统会去找对应id的子进程,并且等待该子进程,如果该子进程退出 ,操作系统会将子进程的退出信息拷贝到status指针所指向的变量当中77    pid_t  ret = waitpid( id, &status , 0 );78 79      //等待成功80      if( ret ==id ) //id是子进程的pid81      {82        //status存放的是子进程的退出信息83        //7F 0111 1111 84        //0xFF85        printf("wait success,ret:%d, exit sig : %d, exit code:%d\n", ret, status&0x7F , (status>>8) &0xFF  ); //打印的分别是 id, 信号, 退出码86      }87 sleep(5);88 89 90   }91   return 0 ;92 }

在这里插入图片描述

通过收到信号判断是否异常
通过看退出码判断是否结果正确

系统当中提供了两个宏来获取退出码和退出信号
WIFEXITED(status):用于查看进程是否是正常退出,本质是检查是否收到信号
WEXITSTATUS(status):用于获取进程的退出码

exitNormal = WIFEXITED(status);  //获取退出信号,判断是否正常退出
exitCode = WEXITSTATUS(status);  //获取退出码

例如:

 1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(1)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {45   pid_t id = fork() ;46   if(id <0)47   {48     perror("fork");49     return 1 ;50   }51   else if( id == 0 )                                                                                                                                                                       52   {53    //child 54    55    int cnt =5 ;56    while(cnt)57    {58      printf("I am a child ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);59      cnt -- ;60      sleep(1);61    }62      exit(1);63   }64    else // parent 65   {66     int cnt =10  ;67     while(cnt )68     {69      printf("I am a parent ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);70      cnt -- ;71      sleep(1); 72     }73     // pid_t ret = wait(NULL);74      75    int status =0 ;//输出型参数76    //操作系统会去找对应id的子进程,并且等待该子进程,如果该子进程退出 ,操作系统会将子进程的退出信息拷贝到status指针所指向的变量当中77    pid_t  ret = waitpid( id, &status , 0 );78 79      //等待成功80      if( ret ==id ) //id是子进程的pid81      {82        //status存放的是子进程的退出信息83        //7F 0111 1111 84        //0xFF85        //printf("wait success,ret:%d, exit sig : %d, exit code:%d\n",      ret, status&0x7F , (status>>8) &0xFF  ); //打印的分别是 id, 信号, 退出码if(WIFEXITED(status) )88        {89            printf("进程是正常跑完的,退出码:%d\n",WIFEXITED(status));90        }91        else92        {93          printf("进程出异常了\n");94        }86      }87 sleep(5);88 89 90   }91   return 0 ;92 }

以下代码中同时创建了10个子进程
父进程再使用waitpid函数指定等待这10个子进程

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h>6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(cnt)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {//创建多进程19   for( int i =0 ; i < N ;i ++ )20   {21     pid_t id  =  fork();22     if( id ==0  )23     {24       //子进程25       Runchild ();                                                                                                                                                                         26       exit(i);27     }28     //父进程 29     printf("create child process: %d success\n", id);30   }31 //  sleep(10);32   //多进程等待33   for( int i = 0 ; i < N  ; i++ )34   {35 //      pid_t id   =  wait(NULL);36      int status =0 ;37     pid_t id=    waitpid(-1 , &status ,0 );38 39      if( id>0 )40      {41        printf("wait %d success,exit code:%d\n", id,WEXITSTATUS(status ) )  ; //id ,退出码42      }43 44   }45 46 sleep(5);
108   return 0 ;
109 }

options:
1、options为0时,父进程阻塞等待
2、options为WNOHANG时,若等待的子进程没有结束,则waitpid函数直接返回0,不予以等待。若正常结束,则返回该子进程的pid

非阻塞轮询
options为WNOHANG时,父进程等待子进程中实现非阻塞

例如,父进程可以隔一段时间调用一次waitpid函数,若是等待的子进程尚未退出,则父进程可以先去做一些其他事,过一段时间再调用waitpid函数读取子进程的退出信息。

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<sys/types.h>5 #include<sys/wait.h> 6 #define N 10 7   void     Runchild ()8 {9   int cnt =5 ;10   while(cnt)11   {12     printf("child pid:%d ,ppid%d\n",getpid() ,getppid());13     sleep(1);14     cnt--;15   }16 }17 int main()18 {48  pid_t id = fork() ;49  if(id <0)50  {51    perror("fork");                                                                                                                                                                         52    return 1 ;53  }54  else if( id == 0 )55  {56   //child 57   58   int cnt =3 ;59   while(cnt)60   {61     printf("I am a child ,pid:%d , ppid:%d cnt: %d\n", getpid() , getppid() ,cnt);62     cnt -- ;63     sleep(1);64   }65     exit(11);66  }67   else // parent 68  {78   int status =0 ;//输出型参数79   //操作系统会去找对应id的子进程,并且等待该子进程,如果该子进程退出 ,操作系统会将子进程的退出信息拷贝到status指针所指向的变量当中80   while(1)  //轮询81   {82 83   pid_t  ret = waitpid( id, &status , WNOHANG ); //非阻塞等待84 85     //等待成功86     if( ret >0 ) //id是子进程的pid87     {88       //status存放的是子进程的退出信息89       //7F 0111 1111 90       //0xFF91      // printf("wait success,ret:%d, exit sig : %d, exit code:%d\n", ret, status&0x7F , (status>>8) &0xFF  ); //打印的分别是 id, 信号, 退出码92      93       if(WEXITSTATUS(status) )94       {95           printf("进程是正常跑完的,退出码:%d\n",WEXITSTATUS(status));96       }97       else 98       {99         printf("进程出异常了\n");
100       }
101        break;
102     }
103     else if ( ret< 0 ) 
104     {
105      printf("wait failed\n");
106      break;
107     }
108     else  //ret==0
109     {
110     printf("子进程还没有退出我再等等\n") ;
111     sleep(1);
112     }
113   }
114   sleep(3);
115 
116 
117  }
118   return 0 ;
119 }

在这里插入图片描述
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注你们的每一次支持都将转化为我前进的动力!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之链表深度讲解

小伙伴们&#xff0c;大家好呀&#xff0c;上次听我讲完顺序表想必收获不少吧&#xff0c;嘿嘿&#xff0c;这篇文章你也一样可以学到很多&#xff0c;系好安全带&#xff0c;咱们要发车了。 因为有了上一次顺序表的基础&#xff0c;所以这次我们直接进入正题&#xff0c;温馨…

JavaScript 动态网页实例 —— 文字移动

前言 介绍文字使用的特殊效果。本章介绍文字的移动效果,主要包括:文字的垂直滚动、文字的渐隐渐显、文字的闪烁显示、文字的随意拖动、文字的坠落显示、页面内飘动的文字、漫天飞舞的文字、文字的下落效果。对于这些效果,读者只需稍加修改,就可以应用在自己的页面设计中。 …

4.3 JavaScript变量

4.3.1 变量的声明 JavaScript是一种弱类型的脚本语言&#xff0c;无论是数字、文本还是其他内容&#xff0c;统一使用关键词var加上变量名称进行声明&#xff0c;其中关键词var来源于英文单词variable&#xff08;变量&#xff09;的前三个字母。 可以在声明变量的同时对其指定…

多线程与信号量简介

信号量与 PV 操作 计算机中信号量的本质是整数&#xff0c;数值表示可用的资源数量 P 操作 (Passeren > 通过, 原子操作) 若信号量 0&#xff0c;当前任务阻塞 (进入信号量等待队列)若信号量 > 0&#xff0c;则&#xff1a;将信号量数值减一&#xff0c;当前任务继续执…

你知道什么是防抖和节流吗?

目录 1 先举个例子 2 使用场景 3 代码实现 3.1 防抖的实现 3.2 节流的实现 1 先举个例子 防抖&#xff0c;更像是坐电梯&#xff0c;早上眼看9点了&#xff0c;都着急坐电梯上去打卡&#xff0c;但眼看电梯要关了&#xff0c;进来一个人&#xff0c;等几秒&#xff0c;…

uniapp乡村社区户籍问外来人员管理系统 微信小程序python+java+node.js+php

基于微信小程序的外来人员管理系统项目的概述设计分析&#xff0c;主要内容有的私教预约平台系统平台的具体分析&#xff0c;进行数据库的是设计&#xff0c;数据采用MySQL数据库&#xff0c;并且对于系统的设计采用比较人性化的操作设计&#xff0c;对于系统出现的错误信息可以…

信创 | 信创产业人才需求与培养机制:优化策略与实践探索

信创产业的人才需求与培养机制面临着多方面的挑战和机遇。首先&#xff0c;信创产业的快速发展带来了巨大的人才需求&#xff0c;但目前人才培养供给与企业发展需求之间存在不匹配的问题。这种不匹配主要表现在课程体系不健全、产教融合不够深入、校企联动性不足以及职业培训市…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

第16章 基于结构的测试技术(白盒测试技术)

一、静态测试技术 &#xff08;一&#xff09;概述 不运行程序代码的情况下&#xff0c;通过质量准则或其他准则对测试项目进行检查的测试类型&#xff0c;人工或工具检查。 1、代码检查 2、编码规则检查 3、静态分析 静态分析概述 不需要执行程序 控制流分析 通过生成…

短视频矩阵系统源码==3年源头开发

一 短视频矩阵系统具备以下特点: 1.内容管理功能:用户可以在系统中多账号托管 一次性上传、编辑和发布多个短视频平台的内容&#xff0c;无需在每个平台上重复操作&#xff0c;从而提高工作效率并保持内容的一致性和高质量 2.批量剪辑视频:系统支持上传批量素材管理剪辑 视频…

Visual studio调试技巧

Visual studio调试技巧 bug是什么&#xff1f;Debug和ReleaseDebugRelease 如何调试VS调试快捷键调试过程中查看程序信息查看临时变量的值查看内存信息查看调用堆栈查看汇编信息查看寄存器信息 编译常见错误编译型错误链接型错误运行时错误 bug是什么&#xff1f; bug的英文释…

SAM:Segment Anything Model

论文&#xff08;ICCV&#xff0c;fackbook&#xff09;&#xff1a;Segment Anything 源码&#xff1a; https://github.com/facebookresearch/segment-anything demo&#xff1a;Segment Anything | Meta AI (segment-anything.com) 一、摘要 本文介绍了“Segment Anything…

活动回顾 | 春起潮涌——硬件驱动的量化交易与AI

4月20日&#xff0c;华锐技术ACLUB联合AMD在上海举办了“春起潮涌——硬件驱动的量化交易与AI”沙龙活动&#xff0c;会议围绕FPGA硬件加速、CPU&网卡调优、AI技术应用等展开&#xff0c;近50位量化IT与分享嘉宾一起探讨硬件技术在量化交易和AI领域的应用和创新。 FPGA在交…

【C++第七课-string用法】

这里写自定义目录标题 string的初步介绍sring的构造函数string的构造函数-重点掌握无参的构造函数用常量字符串来初始化拷贝构造 string的构造函数-非重点掌握拷贝字符串str从pos位置开始的len个字符拷贝字符串s的前n个字符用n个c去初始化 string的赋值string的遍历和访问下标[…

爬虫自动化之drissionpage实现随时切换代理ip

目录 一、视频二、dp首次启动设置代理三、dp利用插件随时切换代理一、视频 视频直接点击学习SwitchyOmega插件使用其它二、dp首次启动设置代理 from DrissionPage import ChromiumPage, ChromiumOptions from loguru

matplotlib/seaborn 绘图可视化全面总结

1.概述 使用Matplotlib 绘图实现可视化时&#xff0c;会面临不同的需求有所调整&#xff0c;本文档重点对绘图过程中产生的一些小众需求进行全面总结&#xff0c;其他任务时可以随时即抽即用。 2.绘图 2.1 一般绘图 plt.figure() 参数设置说明 matplotlib.pyplot.figure( …

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

【论文阅读】Tutorial on Diffusion Models for Imaging and Vision

1.The Basics: Variational Auto-Encoder 1.1 VAE Setting 自动编码器有一个输入变量x和一个潜在变量z Example. 获得图像的潜在表现并不是一件陌生的事情。回到jpeg压缩&#xff0c;使用离散余弦变换&#xff08;dct&#xff09;基φn对图像的底层图像/块进行编码。如果你给…

先电2.4的openstack搭建

先电2.4版本的openstack&#xff0c;前期虚拟机部署参考上一篇2.2版本&#xff0c;基本步骤是一样的&#xff0c;准备两个镜像文件CentOS-7.5-x86_64-DVD-1804.iso&#xff0c;XianDian-IaaS-V2.4.iso [rootcontroller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777…

华为OD机试 - 小扇和小船的数字游戏 - 二进制(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…