当前位置: 首页 > news >正文

Linux:进程(三)——进程状态

目录

Linux源代码对进程的描述

R

S

D

T

t

X

Z(进程僵尸)

孤儿进程


Linux源代码对进程的描述

        理论上把进程状态大致被分为了:运行、阻塞、挂起。那么,在操作系统中具体是如何描述状态的。(有时候Linux内核也把进程称为任务)

        Linux内核的源代码定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R

        R(running),运行状态,并不意味着进程一定正在被CPU执行,只要进程在运行队列中,都显示为运行状态。(对应理论中的运行状态)

S

        S(sleeping),睡眠状态,意味着进程正在等待硬件或者软件资源,用S表示的睡眠状态是可中断睡眠,也称为浅度睡眠。(对应理论中的阻塞状态)

        在目录24919下面编辑文件myprocess.c的内容如下。

[euto@VM-4-13-centos 24919]$ cat myprocess.c 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>int main()
{ while(1){printf("I am a process\n");sleep(1);}return 0;
}

        程序运行起来后,不要中断运行。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
·······

        在新的窗口打印进程信息。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND4223  7525  7525  4223 pts/2     7525 S+    1001   0:00 ./myprocess7157  7564  7563  7157 pts/3     7563 R+    1001   0:00 grep --color=auto myprocess

        其中STAT这一列用来表示运行状态。

  • 程序myprocess正在被执行,打印的进程状态应该是R,为什么是S?

        其实这和程序的功能有关,我所写的这个源文件只有一行printf,当程序运行起来后,执行printf这一行代码的速度是非常非常快的,而这一行代码的执行结果是要把字符串输出到显示器,显示器属于硬件资源,其实这个程序的99%的时间都用来将字符串输出到显示器,这个进程大部分时间都是在阻塞队列中排队,因此,进程状态是S。如果有幸在打印的瞬间,进程正在运行队列中排队,那么打印的结果就会是R。

        实际上大部分进程都会和外设产生关联,因此大部分进程都处在S状态,而非R状态。

  • 为什么grep的进程状态是R?

        grep用来全局搜索,那么,只有当grep处于运行状态R时,才能做正在搜索的动作。

  • S+中的'+'是什么意思?

        我们在命令行中运行程序后,所启动的程序可以称为前台程序,前台程序启动后,在命令行执行其他指令是没有响应的,使用Ctrl + C可以中断运行,如果是前台程序,则进程状态都会有'+'的字样。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
I am a process
I am a process
pwdI am a process//运行pwd是没有响应的I am a process
I am a process
I am a process
cdI am a process//运行cd是没有响应的.I am a process
^HcI am a process
^H^HI am a process
cd ..I am a processI am a process
^C//Ctrl+C是可以中断执行流的

        如果执行下面这条指令来运行可执行程序,则启动的程序称为后台程序,后台程序运行的时候,如果在命令行中执行其他指令,是可以被响应的。但是执行Ctrl + C不能中断运行后台程序。后台进程的进程状态不带'+'字样。

[euto@VM-4-13-centos 24919]$ ./myprocess &
[1] 7297
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
pwd//pwd被响应
/home/euto/linux/24919
[euto@VM-4-13-centos 24919]$ I am a process
lsI am a processMakefile  myprocess  myprocess.c
[euto@VM-4-13-centos 24919]$ llI am a process
//ll被响应
total 20
-rw-rw-r-- 1 euto euto   82 Sep 19 17:56 Makefile
-rwxrwxr-x 1 euto euto 8416 Sep 19 19:47 myprocess
-rw-rw-r-- 1 euto euto  173 Sep 19 19:46 myprocess.c
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
^C//Ctrl + C不能中断运行
[euto@VM-4-13-centos 24919]$ I am a process
I am a process

       进程状态不带'+'字样。

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606   824   824 31606 pts/1    31606 S     1001   0:00 ./myprocess476   861   860   476 pts/2      860 S+    1001   0:00 grep --color=auto myprocess

        如果要中断运行,则执行kill指令杀掉进程。

[euto@VM-4-13-centos 24919]$ kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

        信号9的功能是杀掉进程,后面跟上进程的PID。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
13708  7297  7297 13708 pts/2    13708 S     1001   0:00 ./myprocess
13887  7493  7492 13887 pts/3     7492 S+    1001   0:00 grep --color=auto myprocess
[euto@VM-4-13-centos 24919]$ kill -9 7297//杀掉进程
·········
I am a process[1]+  Killed                  ./myprocess

D

        D(disk sleeping),磁盘睡眠状态,只不过这种睡眠状态是不可中断睡眠,也称为深度睡眠。(D状态也对应理论中的阻塞状态)。

        一般,如果一个进程在等待磁盘的资源,那么这个进程的状态大概率会被设置为D。在内存资源紧张的时候,这个时候操作系统要选择释放掉部分进程,而状态为D的进程,操作系统会保留。

        一般如果出现D状态的进程,说明操作系统访问磁盘的速度已经非常慢了,系统离奔溃也不远了。

T

        T(stopped),暂停状态,如果一个进程想要获取某种硬件或者软件资源,但是当前资源并不能让进程获取到(比如不允许进程访问显示器资源),而操作系统也不想杀掉这个进程,为了防止这个进程有非法操作,故将这个进程状态设置为T。(T也对应理论中的阻塞状态)

        通过kill命令发送19号信号,可以让进程处于暂停的状态,同时也变成了后台进程。可以发送18号信号让进程继续运行。

18) SIGCONT	19) SIGSTOP
[euto@VM-4-13-centos 24921]$ kill -19 12235
[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 12235 12235 31606 pts/1    31606 T     1001   0:00 ./myprocess476 12402 12401   476 pts/2    12401 S+    1001   0:00 grep --color=auto myprocess

t

        t(tracing stop),被追踪的暂停状态。一般在调试程序中,程序在断点处暂停的时候,就是被gdb程序追踪的暂停状态。(t也对应理论中的阻塞状态)

        启动调试程序后,在第10行打一个断点。

(gdb) l 0
1	#include <stdio.h>
2	#include <unistd.h>
3	#include <sys/types.h>
4	#include <stdlib.h>
5	
6	int main()
7	{ 
8	  while(1)
9	  {
10	   printf("I am a process\n");
(gdb) b 10
Breakpoint 1 at 0x400581: file myprocess.c, line 10.
(gdb) r
Starting program: /home/euto/linux/24921/myprocess Breakpoint 1, main () at myprocess.c:10
10	   printf("I am a process\n");
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
(gdb) 
······

        此时查看进程状态就是t状态

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 25839 25839 31606 pts/1    25839 S+    1001   0:00 gdb myprocess
25839 25940 25940 31606 pts/1    25839 t     1001   0:00 /home/euto/linux/24921/myprocess476 26437 26436   476 pts/2    26436 S+    1001   0:00 grep --color=auto myprocess

X

        X(dead),X就是理论中的终止状态、进程死亡后的状态,X一般是瞬时状态,没法打印出来。(对应理论中的死亡或者终止状态)。

Z(进程僵尸)

        Z(zombie),僵尸状态

        当一个进程准备死亡之前,(进程 = PCB+可执行程序)操作系统会把代码和数据释放掉,但是PCB会保留一段时间,在这段时间内,进程就是处于Z状态

        注意,处于Z状态的时候,进程已经退出了,只是PCB被保留一段时间。

        进程消亡的时候,都要先后经过Z、X两种状态

  • 那么,为什么操作系统要把一个消亡进程的PCB保留一段时间?

        进程都有父进程,子进程都是由父进程创建出来的。父进程创建子进程的目的必然是为了完成某一个任务,达到某种需求,那么,当这个进程快要消亡的时候,这个进程所肩负的任务是否完成,以及具体详情是怎么样的,都要由父进程调用子进程的PCB才能得知,故保留子进程的PCB一段时间来让父进程获取信息。

  • 如果父进程没有调用消亡子进程的PCB会怎样?

        操作系统会把这个PCB一直保留,这也算作内存泄露!!!


        编辑源文件的内容如下。

int main()
{pid_t id = fork();if(id == 0){int cnt = 5;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程while(1){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}return 0;
}

        这个程序在运行五秒后,子进程退出,由于父进程没有读取PCB,故子进程会处于僵尸状态。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
······
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>
······

        让父进程获取子进程的PCB信息后,那么子进程的僵尸状态就会消失,变成X状态,只是X状态是瞬时状态,显示器速度太慢,我们打印不出来。

        编辑源文件内容如下,子进程变成僵尸后,要让父进程作等待操作wait。

man 2 wait
WAIT(2)                         Linux Programmer's Manual                        WAIT(2)NAMEwait, waitpid, waitid - wait for process to change stateSYNOPSIS#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
·······

        父子进程一起运行5s后。子进程变僵尸状态,父进程继续运行5s。然后父进程等待,僵尸状态消失。父进程再运行5s后,程序结束运行。 

int main()
{pid_t id = fork();if(id == 0){int cnt = 5;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程int cnt = 10;while(cnt){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}wait(NULL);printf("father get child\n");sleep(5);return 0;
}

        运行结果符合预期。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>
······PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······

孤儿进程

        如果父子进程中,父进程先退出,子进程会发生什么变化。

        编辑源文件内容如下,让子进程运行50秒,让父进程运行5s,则父进程会先退出。

int main()
{pid_t id = fork();if(id == 0){int cnt = 50;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程int cnt = 5;while(cnt){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}

        运行结果如下。

[euto@VM-4-13-centos 24921]$ ./myprocess 
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am child,pid:31425,ppid:31424
[euto@VM-4-13-centos 24921]$ I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
······

        运行五秒后,父进程退出,子进程变成孤儿进程,同时变成后台进程。此外,子进程被PID为1的进程“领养”

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 31424 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocess
31424 31425 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocess

        PID为1的进程就是操作系统自己

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep 1 | grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND0     1     1     1 ?           -1 Ss       0  33:30 /usr/lib
/systemd/systemd --switched-root --system --deserialize 22

相关文章:

Linux:进程(三)——进程状态

目录 Linux源代码对进程的描述 R S D T t X Z&#xff08;进程僵尸&#xff09; 孤儿进程 Linux源代码对进程的描述 理论上把进程状态大致被分为了&#xff1a;运行、阻塞、挂起。那么&#xff0c;在操作系统中具体是如何描述状态的。&#xff08;有时候Linux内核也把…...

Effective Java 学习笔记 如何为方法编写文档

目录 方法的文档注解设计的原则 Javadoc常用的文档注释 一些注意细节 通过Javadoc命令生成h5页面 这是第8章Java方法的最后一部分&#xff0c;聚焦为导出的API编写文档注释。 如果要想使得API真正可用&#xff0c;配套的文档是必须的。Java提供了Javadoc这个文档生成工具&…...

TCP四大拥塞控制算法总结

四大算法&#xff1a;1.慢启动&#xff0c;2.拥塞避免&#xff0c;3.拥塞发生&#xff0c;4.快速恢复。 慢启动&#xff1a; 首先连接建好的开始先初始化拥塞窗口cwnd大小为1&#xff0c;表明可以传一个MSS大小的数据。 每当收到一个ACK&#xff0c;cwnd大小加一&#xff0c…...

深入解析ElasticSearch从基础概念到性能优化指南

一.引言 ElasticSearch是一个分布式的搜索和分析引擎&#xff0c;专为处理大规模的结构化和非结构化数据而设计。它建立在Apache Lucene之上&#xff0c;提供了强大的全文搜索能力、高可用性和实时分析的功能。无论是作为日志分析平台&#xff0c;还是作为数据驱动的应用程序的…...

git分支合并时忽略指定文件

分支合并忽略特定文件步骤 1.在项目根目录下cmd窗口运行以下命令 git config merge.ours.driver true2.在项目根目录下新建文件.gitattributes然后文件中写入需要忽略的文件名 mergeours, 一个文件占一行 Dockerfile mergeours /nginx/default.conf mergeours...

基于微信小程序的童装商城的设计与实现+ssm(lw+演示+源码+运行)

童装商城小程序 摘 要 随着移动应用技术的发展&#xff0c;越来越多的用户借助于移动手机、电脑完成生活中的事务&#xff0c;许多的传统行业也更加重视与互联网的结合&#xff0c;由于城镇人口的增加&#xff0c;人们去商场购物总是排着长长的队伍&#xff0c;对于时间紧的人…...

什么叫后验分布

后验分布&#xff08;Posterior Distribution&#xff09;是在贝叶斯统计中一个重要的概念。它指的是在观测到数据之后&#xff0c;对参数或潜变量的分布的更新。具体来说&#xff0c;后验分布是基于先验分布&#xff08;Prior Distribution&#xff09;和似然函数&#xff08;…...

Godot游戏如何提升触感体验

在游戏世界中&#xff0c;触感体验至关重要&#xff0c;既能极大提升玩家沉浸感&#xff0c;让其深度融入游戏&#xff0c;在操作角色或与环境互动时&#xff0c;通过触感反馈获得身临其境的真实感&#xff08;比如动作游戏中角色攻击或受击时的振动反馈&#xff0c;能使玩家更…...

数字图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…...

【STL】 set 与 multiset:基础、操作与应用

在 C 标准库中&#xff0c;set 和 multiset 是两个非常常见的关联容器&#xff0c;主要用于存储和管理具有一定规则的数据集合。本文将详细讲解如何使用这两个容器&#xff0c;并结合实例代码&#xff0c;分析其操作和特性。 0.基础操作概览 0.1.构造&#xff1a; set<T&…...

xhs 小红书 x-s web 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…...

胤娲科技:谷歌DeepMind祭出蛋白质设计新AI——癌症治疗迎来曙光

在科技的浩瀚星空中&#xff0c;DeepMind的“阿尔法”家族总是能带来令人瞩目的璀璨光芒。这一次&#xff0c;它们再次以惊人的姿态&#xff0c; 将AI的触角深入到了生命的微观世界——蛋白质设计领域&#xff0c;为我们描绘了一幅未来医疗的宏伟蓝图。 想象一下&#xff0c;一…...

【后端】【nginx】nginx常用命令

文章目录 1. 启动与停止相关命令2. 配置文件检查与验证3. 查看日志4. 查看状态与版本5. 端口与连接相关命令 1. 启动与停止相关命令 # 启动 NGINX sudo nginx# 立即停止 NGINX sudo nginx -s stop# 优雅停止 NGINX sudo nginx -s quit# 优雅重载配置 sudo nginx -s reload# 完…...

MATLAB系列08:输入/输入函数

MATLAB系列08&#xff1a;输入/输入函数 8. 输入/输入函数8.1 函数textread8.2 关于load和save命令的进一步说明8.3 MATLAB文件过程简介8.4 文件的打开和关闭8.4.1 fopen函数8.4.2 fclose函数 8.5 二进制 I/O 函数8.5.1 fwrite 函数8.5.2 fread函数 8.6 格式化 I/O 函数8.6.1 f…...

《财富之眼:用经济思维看清世界》pdf电子书下载

《财富之眼&#xff1a;用经济思维看清世界》pdf电子书下载 内容简介 一切社会现象都是经济现象&#xff0c;我们只能赚到自己认知范围内的 钱。我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不 平衡不充分的发展之间的矛盾&#xff0c;其中“不平衡不充分”很大程…...

QT中文乱码

文章目录 方法一方法二 方法一 fromLocal8Bit() 可以把中文转为Unicode eg:QString str QString::fromLocal8Bit(“中文简体”); 方法二 预处理&#xff0c;根据设置的本地字符集转换&#xff0c;能正确转换含有中文的QString。 #pragma execution_character_set("u…...

如何安装1Panel面板并架设一个静态网站

我们通常要架设网站在vps上&#xff0c;就要用到面板&#xff0c;一般是宝塔&#xff0c;但这个面板收费项目较多&#xff0c;用着不太方便。相比宝塔面板&#xff0c;1panel面板是国内功能强大、操作简单、免费易学的Linux服务器管理面板。我们还可以使用一键代码来安装这个面…...

craco-less使用问题

craco-less使用问题 问题背景 前端是用React搭建&#xff0c;使用craco配置&#xff0c;相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境&#xff…...

14 vue3之内置组件trastion全系列

前置知识 Vue 提供了 transition 的封装组件&#xff0c;在下列情形中&#xff0c;可以给任何元素和组件添加进入/离开过渡: 条件渲染 (使用 v-if)条件展示 (使用 v-show)动态组件组件根节点 自定义 transition 过度效果&#xff0c;你需要对transition组件的name属性自定义。…...

力扣(leetcode)每日一题 LCR 187 破冰游戏(还是考的约瑟夫环)

题干 社团共有 num 位成员参与破冰游戏&#xff0c;编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target&#xff0c;从 0 号成员起开始计数&#xff0c;排在第 target 位的成员离开圆桌&#xff0c;且成员离开后从下一个成员开始计数。请返回游戏结束…...

nginx模块篇(四)

文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量&局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablef…...

奇安信渗透2面经验分享

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…...

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换&#xff0c;报文交换&#xff0c;分组交换&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 &#x1f3af;一.划分…...

【TypeScript入坑】什么是TypeScript?

TypeScript入坑 什么是 TypeScriptTypeScript 的优势 什么是 TypeScript TypeScript&#xff1a;是 JavaScript 的超集&#xff0c;拥有类型机制&#xff0c;不会再浏览器直接执行&#xff0c;而是编译成 JavaScript 后才会运行。 超集&#xff08;superset&#xff09;&…...

Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus,照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈,可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议,使用纯 C 语言开发,不涉及任何硬件接口,可以直接在任何形式的硬件上使用。由…...

mysql5.7.44安装教程

mysql5.7.44安装教程 1.windows 二进制压缩包从MySQL官网下载即可。 2.解压后&#xff0c;在根目录下创建my.ini文件 [mysql] # 设置 mysql 客户端默认字符集 default-character-setutf8 [mysqld] #设置 3306 端口 port 3306 # 设置 mysql 的安装目录 basedir …...

etsts

Dockerfile FROM apache/flink:1.19-scala_2.12-java8 RUN mkdir -p $FLINK_HOME/usrlib COPY MysqlFlinkCdcToKafka-jar-with-dependencies.jar $FLINK_HOME/usrlib/MysqlFlinkCdcToKafka-jar-with-dependencies.jar 构建镜像的命令 docker buildx build --load --platform l…...

C++_22_异常

文章目录 异常概念&#xff1a;**抛出异常&#xff1a;**关键字&#xff1a; **捕获异常&#xff1a;****栈解旋&#xff1a;****异常的接口声明&#xff1a;****异常对象的生命周期&#xff1a;**1 传递异常对象【不使用】2 传递异常对象指针【不使用】3 传递异常对象引用【**…...

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要&#xff1a;本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性&#xff0c;着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究&#xff0c;强调了针对社群用户量身定制活动时机的必要性&#xff0c…...

从HarmonyOS升级到HarmonyOS NEXT-环信SDK数据迁移

2024年6月21日 HarmonyOS NEXT &#xff08;后续称之为 NEXT&#xff09; 正式发布&#xff0c;随着 NEXT 稳定版的逐渐临近&#xff0c;各个应用及SDK正在忙于适配 NEXT 系统&#xff0c;同样也面临着系统升级时如何对数据的迁移适配。本文通过使用环信 SDK 介绍如何从 Harmon…...