4、linux c 进程
【三】进程
1. 进程与程序的区别
-
程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。
-
进程:执行一个程序所分配的资源的总称,是动态的。
2. 进程的组成部分
-
BSS段(bss):存放程序中未初始化的全局变量。
-
数据段(data):存放已初始化的全局变量。
-
代码段(text):存放程序执行代码。
-
堆(heap):通过
malloc
等函数分配内存,动态扩张或缩减。 -
栈(stack):存放局部变量、函数参数和函数返回值,先进后出。
-
进程控制块(PCB):包含进程ID(PID)、进程优先级、文件描述符表等。
3. 进程类型
-
交互进程:用户通过终端与系统交互的进程。
-
批处理进程:在后台运行,不需要用户交互。
-
守护进程:在后台运行的特殊进程,通常用于系统服务。
4. 进程状态
-
运行态:进程正在运行。
-
等待态:进程等待某些资源(如I/O)。
-
停止态:进程被暂停。
-
死亡态:进程已结束,但父进程尚未读取其状态信息。
5. 堆与栈
-
堆(heap):用于存放进程运行中被动态分配的内存段,当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
-
栈(stack):又称堆栈,是用户存放程序临时创建的局部变量,(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
一、查看进程信息
1. ps
命令
用于查看系统进程的快照。
1.1 常用参数
-
-e
:显示所有进程。 -
-l
:长格式显示更详细信息。 -
-f
:全格式显示,通常与其他选项联用。
1.2 输出字段说明
字段 | 含义 |
---|---|
F | 进程标志,说明进程的权限。常见标志:1(不可执行)、4(超级用户权限)等。 |
S | 进程状态。常见状态:-D(不可唤醒的睡眠状态)、-R(运行)、-S(睡眠)、-T(停止)、-Z(僵尸进程)等。 |
UID | 运行此进程的用户ID。 |
PID | 进程的ID。 |
PPID | 父进程的ID。 |
C | 进程的CPU使用率(百分比)。 |
PRI | 进程的优先级,数值越小优先级越高。 |
NI | 进程的nice值,数值越小优先级越高。 |
ADDR | 进程在内存中的位置。 |
SZ | 进程占用的内存大小。 |
WCHAN | 进程是否运行,"-"表示正在运行。 |
TTY | 进程由哪个终端产生。 |
TIME | 进程占用CPU的时间。 |
CMD | 产生此进程的命令名。 |
1.3 示例
ps -elf
2. top
命令
用于查看进程的动态信息。
2.1 常用操作
-
shift + >
:后翻页。 -
shift + <
:前翻页。 -
top -p PID
:查看指定进程。
3. /proc
目录
用于查看进程的详细信息。
每个进程在/proc
目录下都有一个以PID命名的子目录,包含进程的各种信息文件,如status
、maps
等。
二、改变进程优先级
1. nice
命令
按用户指定的优先级运行进程。
1.1 命令格式
nice [-n NI值] 命令
-
NI值范围:-20~19。
-
数值越大,优先级越低。
-
普通用户可调整范围为0~19,只能调高优先级。
-
只有
root
用户可以设置负值。
-
2. renice
命令
改变正在运行进程的优先级。
2.1 命令格式
renice [优先级] PID
三、进程管理
1. 查看后台进程
1.1 命令
jobs
2. 将挂起的进程在后台运行
2.1 命令
bg
3. 将后台进程放到前台运行
3.1 命令
fg
4. 将前台进程转为后台并停止
4.1 操作
Ctrl + Z
5. 后台运行程序
5.1 示例
./test &
四、创建子进程
1. fork()
函数
创建新的进程。
1.1 函数原型
#include <unistd.h> pid_t fork(void);
1.2 返回值
-
成功:
-
父进程返回子进程的PID。
-
子进程返回0。
-
-
失败:返回-1。
1.3 特点
-
子进程只执行
fork()
之后的代码。 -
父子进程的执行顺序由操作系统决定。
-
子进程继承父进程的内容,但父子进程有独立的地址空间。
1.4 注意事项
-
若父进程先结束:
-
子进程成为孤儿进程,被
init
进程收养。 -
子进程可能成为后台进程。
-
-
若子进程先结束:
-
父进程如果没有及时回收,子进程变成僵尸进程。
-
1.5 示例
#include <stdio.h> #include <unistd.h> int main() {pid_t pid = fork();if (pid == -1) {perror("fork failed");return 1;} else if (pid == 0) {printf("I am the child process, PID: %d\n", getpid());} else {printf("I am the parent process, PID: %d, Child PID: %d\n", getpid(), pid);}return 0; }
五、进程的退出
1. exit()
函数
结束当前进程。
1.1 函数原型
#include <stdlib.h> void exit(int status);
1.2 特点
-
会刷新流缓冲区。
-
通常用于正常退出。
2. _exit()
函数
结束当前进程。
2.1 函数原型
#include <unistd.h> void _exit(int status);
2.2 特点
-
不刷新流缓冲区。
-
通常用于异常退出。
3. return
与exit
的区别
-
main
函数结束时会隐式调用exit
。 -
普通函数的
return
是返回上一级。
六、进程的回收
1. wait()
函数
回收子进程。
1.1 函数原型
#include <unistd.h> pid_t wait(int *status);
1.2 返回值
-
成功时返回回收的子进程的 PID。
-
失败时返回 -1。
1.3 特点
-
若子进程未结束,父进程会阻塞。
-
status
用于保存子进程的返回值和结束方式。 -
若
status
为NULL
,表示直接释放子进程的 PCB。
2. waitpid()
函数
更灵活的子进程回收。
2.1 函数原型
#include <unistd.h> pid_t waitpid(pid_t pid, int *status, int options);
2.2 参数说明
-
pid
:-
>0
:只等待指定 PID 的子进程。 -
= -1
:等待任意子进程。 -
= 0
:等待同一进程组中的子进程。 -
< -1
:等待指定进程组中的子进程。
-
-
options
:-
WNOHANG
:非阻塞,若子进程未结束,立即返回 0。 -
WUNTRACED
:返回终止子进程信息和因信号停止的子进程信息。
-
2.3 示例代码
示例 1:wait()
示例
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() {pid_t pid = fork();if (pid == -1) {perror("fork failed");return 1;} if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid());sleep(2); // 模拟子进程运行printf("Child process finished\n");return 0; // 子进程退出} else {// 父进程printf("Parent process, PID: %d, waiting for child...\n", getpid());int status;wait(&status); // 等待子进程结束printf("Child process exited with status: %d\n", status);return 0;} }
示例 2:waitpid()
示例
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() {pid_t pid = fork();if (pid == -1) {perror("fork failed");return 1;} if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid());sleep(3); // 模拟子进程运行printf("Child process finished\n");return 0; // 子进程退出} else {// 父进程printf("Parent process, PID: %d, waiting for child...\n", getpid());int status;pid_t ret = waitpid(pid, &status, WNOHANG); // 非阻塞等待子进程if (ret == 0) {printf("Child process is still running\n");} else if (ret == -1) {perror("waitpid failed");} else {printf("Child process exited with status: %d\n", status);}return 0;} }
七、exec
函数族
1. 背景
fork
创建进程后,子进程会继承父进程的代码和数据,父子进程执行相同的代码。然而,在实际开发中,我们通常希望子进程执行与父进程不同的程序。exec
函数族的作用就是用来替换当前进程的代码和数据,从而执行指定的程序。
2. 作用
exec
函数族用于替换当前进程的代码和数据,执行指定的程序。这些函数不会创建新的进程,而是直接替换当前进程的内容。
3. 函数原型
#include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int system(const char *command);
4. 参数说明
4.1 execl
int execl(const char *path, const char *arg, ...);
-
path
:指定要执行的程序的路径。 -
arg
:传递给程序的参数列表,必须以NULL
结尾。 -
特点:参数列表是可变参数,每个参数都是字符串。
4.2 execlp
int execlp(const char *file, const char *arg, ...);
-
file
:指定要执行的程序的文件名。execlp
会在环境变量PATH
中查找该文件。 -
arg
:传递给程序的参数列表,必须以NULL
结尾。 -
特点:不需要指定文件的全路径,
execlp
会自动在PATH
中查找。
4.3 execv
int execv(const char *path, char *const argv[]);
-
path
:指定要执行的程序的路径。 -
argv
:传递给程序的参数数组,必须以NULL
结尾。 -
特点:参数以数组形式传递,适合参数较多的情况。
4.4 execvp
int execvp(const char *file, char *const argv[]);
-
file
:指定要执行的程序的文件名。execvp
会在环境变量PATH
中查找该文件。 -
argv
:传递给程序的参数数组,必须以NULL
结尾。 -
特点:不需要指定文件的全路径,
execvp
会自动在PATH
中查找。
4.5 system
int system(const char *command);
-
command
:要执行的命令字符串。 -
特点:
system
是一个高级函数,会调用/bin/sh
来执行命令。它会创建一个子进程来运行命令,并等待命令执行完成。
5. 返回值
-
成功:执行指定的程序,不会返回到调用
exec
的代码。 -
失败:返回 -1,并设置
errno
。
6. 特点
-
进程替换:
exec
函数会替换当前进程的代码和数据,但进程号(PID)保持不变。 -
参数传递:
-
第一个参数(如
arg
或argv[0]
)通常是程序的名称,虽然它在程序中没有实际用途。 -
参数列表或数组必须以
NULL
结尾。
-
-
路径查找:
-
execl
和execv
需要指定程序的完整路径。 -
execlp
和execvp
会在环境变量PATH
中查找程序。
-
-
环境变量:
exec
函数不会改变当前进程的环境变量。
7. 示例代码
示例 1:execl
示例
#include <stdio.h> #include <unistd.h> int main() {printf("Before exec\n");execl("/bin/ls", "ls", "-l", NULL); // 替换当前进程为 ls 程序printf("After exec\n"); // 不会执行到这里return 0; }
示例 2:execlp
示例
#include <stdio.h> #include <unistd.h> int main() {printf("Before exec\n");execlp("ls", "ls", "-l", NULL); // 替换当前进程为 ls 程序printf("After exec\n"); // 不会执行到这里return 0; }
示例 3:execv
示例
#include <stdio.h> #include <unistd.h> int main() {printf("Before exec\n");char *args[] = {"/bin/ls", "-l", NULL};execv("/bin/ls", args); // 替换当前进程为 ls 程序printf("After exec\n"); // 不会执行到这里return 0; }
示例 4:execvp
示例
#include <stdio.h> #include <unistd.h> int main() {printf("Before exec\n");char *args[] = {"ls", "-l", NULL};execvp("ls", args); // 替换当前进程为 ls 程序printf("After exec\n"); // 不会执行到这里return 0; }
示例 5:system
示例
#include <stdio.h> #include <stdlib.h> int main() {printf("Before system\n");system("ls -l"); // 使用 shell 执行命令printf("After system\n"); // 会执行到这里return 0; }
exec
函数族的使用注意事项
1. 参数传递
-
参数列表或数组必须以
NULL
结尾,否则会导致未定义行为。 -
第一个参数(如
arg
或argv[0]
)通常是程序的名称,虽然它在程序中没有实际用途,但建议正确填写。
2. 环境变量
-
exec
函数不会改变当前进程的环境变量。如果需要修改环境变量,可以使用putenv
或setenv
函数。
3. 文件描述符
-
在调用
exec
函数之前,应确保关闭不需要的文件描述符,以避免资源泄漏。 -
如果需要保留某些文件描述符(如日志文件),应确保它们在调用
exec
之前已正确打开。
4. 错误处理
-
如果
exec
函数失败,会返回 -1,并设置errno
。可以通过perror
或strerror
获取错误信息。 -
常见错误包括:
-
文件路径错误或文件不存在。
-
文件没有执行权限。
-
环境变量
PATH
中未找到程序。
-
-
与
fork
结合使用
-
exec
函数通常与fork
结合使用,创建子进程并执行不同的程序。 -
示例代码:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() {pid_t pid = fork();if (pid == -1) {perror("fork failed");return 1;} if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid());execlp("ls", "ls", "-l", NULL); // 子进程执行 ls 程序perror("execlp failed"); // 如果 execlp 失败,会执行到这里return 1;} else {// 父进程printf("Parent process, PID: %d\n", getpid());wait(NULL); // 等待子进程结束printf("Child process finished\n");}return 0; }
6. 使用 system
的注意事项
-
system
函数会调用/bin/sh
来执行命令,因此可能会引入安全风险(如注入攻击)。 -
如果需要执行简单的命令,可以使用
system
,但建议优先使用exec
函数族。 -
示例:避免注入攻击
#include <stdio.h> #include <stdlib.h> int main() {char *filename = "test.txt";char command[256];snprintf(command, sizeof(command), "ls -l %s", filename); // 安全地构造命令system(command);return 0; }
八、守护进程(Daemon Process)
1. 概念
守护进程(Daemon Process)是一种生存期较长的进程,通常独立于控制终端,并周期性地执行某种任务或等待处理某些事件。
2. 特点
-
始终在后台运行,独立于任何终端。
-
周期性地执行任务或等待处理特定事件。
-
是一种特殊的孤儿进程,脱离终端,避免被终端信息打断。
3. 创建守护进程
3.1 简便方法
使用 nohup
命令:
nohup xxxx &
3.2 使用 setsid
函数
#include <unistd.h> pid_t setsid(void);
-
成功时返回调用进程的会话 ID。
-
失败时返回 -1,并设置
errno
。 -
调用
setsid
的进程成为新的会话组长和组长进程。
3.3 使用 getsid
函数
#include <unistd.h> pid_t getsid(pid_t pid);
-
成功时返回调用进程的会话 ID。
-
失败时返回 -1,并设置
errno
。 -
参数
pid
为 0 时,查看当前进程的会话 ID。
3.4 其他辅助函数
-
getpid
:获取进程 ID。pid_t getpid(void);
-
getpgid
:获取进程组 ID。pid_t getpgid(pid_t pid);
4. 创建守护进程的步骤
-
创建子进程,父进程退出:
if (fork() > 0) {exit(0); // 父进程退出 }
-
子进程变成孤儿进程,被
init
进程收养:-
子进程在后台运行。
-
-
子进程创建新会话:
if (setsid() < 0) {exit(-1); // 创建会话失败 }
-
子进程成为新的会话组长。
-
子进程脱离原先的终端。
-
-
更改当前工作目录:
chdir("/"); // 或 chdir("/tmp");
-
防止守护进程的工作目录被卸载。
-
-
重设文件权限掩码:
umask(0); // 文件权限掩码设置为 0
-
关闭打开的文件描述符:
for (int i = 0; i < 3; i++) {close(i); // 关闭标准输入、输出和错误 }
4.1 示例代码
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> int main() {// 创建子进程,父进程退出if (fork() > 0) {exit(0); // 父进程退出} // 创建新会话if (setsid() < 0) {perror("setsid failed");exit(-1);}// 更改当前工作目录 if (chdir("/") < 0) {perror("chdir failed");exit(-1); } // 重设文件权限掩码 umask(0); // 关闭打开的文件描述符 for (int i = 0; i < 3; i++) {close(i); // 关闭标准输入、输出和错误 } // 执行守护进程的任务 while (1) {printf("Daemon process running...\n");sleep(10); // 模拟周期性任务 } return 0; }
九、守护进程的注意事项
1. 避免守护进程占用终端
守护进程不应与终端关联,否则可能会因终端关闭而退出。使用 setsid()
可以确保进程脱离终端。
2. 防止工作目录被卸载
守护进程的工作目录应设置为根目录(/
)或 /tmp
,避免因工作目录被卸载而导致守护进程无法运行。
3. 关闭不必要的文件描述符
守护进程不应继承父进程的文件描述符。关闭标准输入、输出和错误(stdin
、stdout
、stderr
),并根据需要重新打开日志文件。
4. 日志记录
守护进程通常需要记录日志以便调试和监控。可以将日志写入 /var/log
或其他日志文件中,而不是直接输出到终端。
5. 示例:守护进程与日志记录
示例代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() {// 创建子进程,父进程退出if (fork() > 0) {exit(0); // 父进程退出} // 创建新会话if (setsid() < 0) {perror("setsid failed");exit(-1);} // 更改当前工作目录if (chdir("/") < 0) {perror("chdir failed");exit(-1);} // 重设文件权限掩码umask(0); // 关闭标准输入、输出和错误for (int i = 0; i < 3; i++) {close(i);} // 打开日志文件int log_fd = open("/var/log/mydaemon.log", O_WRONLY | O_CREAT | O_APPEND, 0644);if (log_fd < 0) {perror("open log file failed");exit(-1);} // 重定向标准输出和错误到日志文件dup2(log_fd, STDOUT_FILENO);dup2(log_fd, STDERR_FILENO); // 执行守护进程的任务while (1) {printf("Daemon process running...\n");sleep(10); // 模拟周期性任务} return 0; }
相关文章:
4、linux c 进程
【三】进程 1. 进程与程序的区别 程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。 进程:执行一个程序所分配的资源的总称,是动态的。 2. 进程的组成部分 BSS段(bss)&…...
OpenFeign
OpenFeign 工作原理详解 1. 声明式接口 开发者通过定义一个接口,并使用特定的注解(如GetMapping, PostMapping等)来描述HTTP请求。OpenFeign会根据这些注解自动生成相应的HTTP请求。 注解支持: FeignClient:用于定…...
Centos离线安装perl
文章目录 Centos离线安装perl1. perl是什么?2. Perl下载地址3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么? Perl 是一种 高级脚本语言,诞生于 1987 年,以强大的 文本处理能力 和灵活性著称,常用于…...
RabbitMQ可靠性进制
文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动,可能…...
PHP优化技术
最近在学习php语言,打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。 1、引起php性能问题的原因 (1)php语法使用不当 (2)使用php做了它不擅长的事 (3)用php连接的服务不给力 &…...
【Go类库分享】Go expr 通用表达式引擎
【Go类库分享】Go expr 通用表达式引擎 官方教程:https://expr-lang.org/docs/language-definition 官方Github:https://github.com/expr-lang/expr 文章所含代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-d…...
线性代数(1)用 excel 计算鸡兔同笼
线性代数excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析 三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆…...
Docker基础知识介绍
Docker基础篇 必须要在Linux环境下才能运行,windows下运行也是安装虚拟机后才能下载安装运行 下载安装 linux 依次执行下边步骤 更新 yum yum update 卸载旧的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \do…...
机器人交社保属于“无稽之谈”?
今晨浏览社交网站,惊奇地看到“给机器人上社保”的网页搜索结果竟然多达“约 3,280,000个”。所以被称为“无稽之谈”和“本质上是利用社保之名收税”就实不为过,而且还会让人读罢笑得喷饭:“连搞笑大王赵本山见了,也定会拱手作揖…...
接口测试和功能测试的区别
接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…...
人工智能中的线性代数基础详解
线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …...
nginx不在默认的yum仓库的解决方法
1、添加 Nginx 官方仓库 epel-release 是 Extra Packages for Enterprise Linux 的仓库,包含了 nginx 等常用软件。 sudo yum install -y epel-release sudo yum install -y nginx 2、手动添加 Nginx 仓库 如果 epel-release 不可用,可以手动添加 Ng…...
IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力
在现代工业生产和物流领域,物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时,常常存在适应性差、抓取不稳定、操作复杂等问题,导致生产流程中频繁出现停机调整,增加了人工干预成…...
【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;
ERROR in ./src/pages/biddingViews/address_add.vue?vue&typestyle&index0&id41672bf3&scopedtrue&langscss& (./node_modules/vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].use[1]!./node_modules/dcloud…...
堆排序:力扣215.数组中的第K个大元素
一、问题描述 在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…...
【网络协议】应用层协议HTTPS
文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…...
网络安全防护总体架构 网络安全防护工作机制
1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能…...
图像处理篇---图像预处理
文章目录 前言一、通用目的1.1 数据标准化目的实现 1.2 噪声抑制目的实现高斯滤波中值滤波双边滤波 1.3 尺寸统一化目的实现 1.4 数据增强目的实现 1.5 特征增强目的实现:边缘检测直方图均衡化锐化 二、分领域预处理2.1 传统机器学习(如SVM、随机森林&am…...
探针泄露(WEB)
##解题思路 题目提示是探针泄露,未及时删除的探针可能造成严重的数据泄露 探针的文件常见命名为tz.php,访问它 对于php相关参数,我们是可以点击的,点击phpinfo访问 跳转后搜索flag,得到flag...
Webpack总结
Webpack是一个前端模块打包工具。它可以将多个模块按照依赖关系进行静态分析,并生成一个或多个打包后的文件。 Webpack的核心概念包括entry(入口)、output(输出)、loader(加载器)和plugin&…...
什么是物理信息神经网络PINN
定义原理 物理信息神经网络(PINN)是一种创新的机器学习方法,将深度学习与物理知识相结合,旨在解决偏微分方程(PDE)相关问题。PINN的核心思想是在神经网络的训练过程中引入物理定律,从而提高模型的泛化能力和预测精度。 PINN的工作原理基于以下关键步骤: 构建神经网络…...
Java面向对象(中)
面向对象(中) 1.继承性 继承性的好处: 减少了代码的冗余,提高了代码的复用性。 便于功能的拓展。 为多态性的使用提供了前期。 格式: class A extends B {} A:子类,派生类,subclass。 B:父类&#x…...
ospf单区域
OSPF单区域是指将整个自治系统(AS)内的所有路由器划分到同一个逻辑区域(Area 0,即骨干区域)中运行的OSPF协议模式。以下是其核心要点: 一、定义与核心特点 区域统一性 所有路由器均属于同一区域&…...
kali之nmap
kali之nmap Nmap(Network Mapper)是 Kali Linux 中最著名的网络扫描工具之一,广泛用于网络发现、端口扫描、服务识别、操作系统检测等任务。它是一个功能强大且灵活的开源工具,适用于渗透测试、网络管理和安全审计。 1. Nmap 的主…...
【Rust基础】排序和分组
排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort,因为f32和f64未实现O…...
HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南
概述 HUAWEI DevEco Studio(以下简称 DevEco Studio)是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台,专为 HarmonyOS 系统上的应用和元服务(以下简称 应用/元服务)提供高效的开发环境。 作为一款专业…...
R 语言科研绘图 --- 密度图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【拒绝算法PUA】LeetCode 2270. 分割数组的方案数
系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…...
k8s 配置两个deployment主机级别互斥部署
在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。 实现步骤 定义 Deployment: 为每个…...
Axure大屏可视化原型模板及素材:数据可视化的高效解决方案
数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏,作为数据展示和交互的直观平台,能够实时呈现关键数据,帮助企业快速做出决策。Axure作为原型设计领域的领先工具,以其丰富的组件库、强大的交互设计能力和…...
AGI大模型(2):GPT:Generative Pre-trained Transformer
1 Generative Pre-trained Transformer 1.1 Generative生成式 GPT中的“生成式”指的是该模型能够根据输入自动生成文本内容,而不仅仅是从已有的文本库中检索答案。 具体来说: 生成(Generative):GPT是一个生成式AI模型,能够根据给定的提示(Prompt)动态生成连贯、…...
Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例
你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求? 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…...
函数调用汇编
目录 一、核心概念 二、函数调用过程(以 x86 cdecl 为例) 三、x86 vs x64 区别 四、示例分析(C代码 → 汇编) 五、常见问题 一、核心概念 调用约定 (Calling Convention) 规定参数传递顺序(如 cdecl 是右到左&…...
LabVIEW 线性拟合
该 LabVIEW 程序实现了 线性拟合(Linear Fit),用于计算给定一组数据点的斜率(Slope)和截距(Intercept),并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…...
在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤
以下是为客户在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤: 硬件准备: 70b 模型对硬件要求较高,确保办公电脑有足够强大的 GPU(例如 NVIDIA A100 等高端 GPU,因为模型规模较大,普通…...
国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)
1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。 EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...
网络安全需要学多久才能入门?
网络安全是一个复杂且不断发展的领域,想要入行该领域,我们需要付出足够多的时间和精力好好学习相关知识,才可以获得一份不错的工作,那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…...
H5端vue3 SSR 项目报错小计
H5端vue3 SSR 项目报错小计 环境 "vue-router": "^4.1.6" "vue": "^3.2.45", "vant": "^3.4.9",报错复现 ①.页面刷新点击 RouterLink 跳转链接, 页面无法跳转 问题排查 ①.去除 van-popup 使用的 teleport“…...
【Node.js入门笔记4---fs 目录操作】
Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir():创建目录。异步,非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在: 2. fs.mkdirSync():用于创建一个新的目录。异步,非阻塞。3.fs.rmd…...
xcode 旧版本、历史版本下载
下载链接:https://developer.apple.com/download/all/ 版本发布日志:https://developer.apple.com/documentation/xcode-release-notes 需要登录开发者账号,搜索下载即可: 再贴一下网友做的版本统计macOS 版本对应的 Xcode 版本&…...
(十一) 人工智能 - Python 教程 - Python元组
更多系列教程,每天更新 更多教程关注:xxxueba.com 星星学霸 1 元组(Tuple) 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 实例 创建元组: thistuple ("apple", "b…...
【计算机视觉】工业表计读数(1)--基于关键点检测的读数识别方案
随着工业自动化和智能制造的发展,对设备状态实时监控和数据采集提出了更高要求。本文提出了一种基于YOLO的工业表计读数识别方法,通过首先利用YOLO进行表计目标检测,提取出单独的表计图像,然后分别对表针和刻度进行关键点检测&…...
Redis--Zset类型
目录 一、引言 二、介绍 三、命令 1.zadd 2.zrange,zrevrange,zrangebyscore 3.zcard,zcount 4.zpopmax,bzpopmax,zpopmin,bzpopmin 5.zrank,zrevrank,zscore 6.zrem,zremrangebyrank&a…...
Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
SpringBoot 第一课(Ⅲ) 配置类注解
目录 一、PropertySource 二、ImportResource ①SpringConfig (Spring框架全注解) ②ImportResource注解实现 三、Bean 四、多配置文件 多Profile文件的使用 文件命名约定: 激活Profile: YAML文件支持多文档块ÿ…...
期望最大化(EM)算法
MLE (最大似然估计)是一种非常有效的参数估计方法,但当分布中有多余参数或数据为截尾或缺失时,其 MLE 的求取是比较困难的。于是 Dempster 等人于 1977 年提出了 EM 算法,其出发点是把求 MLE 的过程分两步走࿱…...
DeepSeek与人工智能:技术演进、架构解析与未来展望
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 1. DeepSeek技术全景解析1.1 DeepSeek技术定位1.2 核心技术组件 2. 人工智能发展路线2.1 技术…...
Keepalived 多主模型与 LVS 高可用
一.Keepalived多主模型 Keepalived多主模型概念 如上图,keepalived主从架构性能损耗较严重,如果业务分类明确,则可以配置keepalived多主模型降低损耗,两台keepalived互为主备,如:订单业务走keepalived1&am…...
AGI大模型(6):提示词模型进阶
1 零样本提示 如今,经过⼤量数据训练并调整指令的LLM能够执⾏零样本任务。 代码如下: from openai import OpenAI from dotenv import load_dotenv load_dotenv() # 初始化 OpenAI 服务。 client = OpenAI()prompt = """ 将⽂本分类为中性、负⾯或正⾯。 ⽂…...
群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)
摘要 旗鱼优化算法(Sailfish Optimizer, SFO)是一种模拟旗鱼(Sailfish)和沙丁鱼(Sardine)之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为,以及沙丁鱼群的逃逸与…...