【Linux篇】基础IO - 揭秘重定向与缓冲区的管理机制
📌 个人主页: 孙同学_
🔧 文章专栏:Liunx
💡 关注我,分享经验,助你少走弯路!
文章目录
- 一. 理解重定向
- 1.1 理解重定向
- 1.2 dup2
- 1.3 进一步理解重定向
- 输出重定向:
- 追加重定向:
- 输入重定向:
- 任何文件的输出重定向:
- 二. 理解一切皆文件
- 三. 缓冲区
- 3.1 什么是缓冲区
- 3.2 为什么要引入缓冲区
一. 理解重定向
1.1 理解重定向
我们首先得知道文件描述符的分配原则:最小的没有被使用的作为新的fd
分配给用户。
先来看现象:
我们关闭了1
,所以下次新创建文件时,文件被分配到的文件描述符就是1
我们运行,发现并没有在屏幕上打印fd: 1
我们ll
发现多了一个log.txt
,cat log.txt
发现它显示fd:1
本来应该显示到显示器的内容竟然显示在了log.txt
文件里面。
不在屏幕上显示是因为我们把标准输出(1)关了,为什么会往文件里写呢?因为1
这个位置变成了log.txt
文件,这种现象就叫做重定向。
解释现象:
我们在打开文件之前首先把文件描述符1
给close
掉了,所以此时的文件描述符1
就不再指向标准输出了,当我们open
打开新的文件log.txt
时,就找到了1
,把新打开的log.txt
的地址填进来。把1
返回给上层用户,所以用户拿到的文件描述符就是1
。可是我们接下来用到的printf
是C语言提供的函数,它是往stdout
中打印的,stdout
封装的就是1
,printf
只认stdout
中的1
,它找的时候就找到了log.txt
,所以就写到了log.txt
中了。
我们刚才做的在底层更改一个文件描述符内容的指向,这种现象叫做重定向。
再看一个现象:
我们在printf
后面加上close(fd)
1.2 dup2
重定向的系统调用dup2
#include <unistd.h>int dup2(int oldfd, int newfd);
我们要实现重定向是想让1
里面的指针指向新的文件,3
如果是我们新创建的文件,那么我们应该把1
里面的指针内容方到3
里面还是把3
里面的指针内容放到1
里面呢?答案是把3
里面的内容放到1
里面,1
是3
的一份拷贝,即1
是fd
的一份拷贝,所以oidfd
就是fd
,1
是newfd
,所以传参时dup2(fd,1)
我们就会发现它就不会再显示器上打了,而打印到了log.txt
文件中。
这次我们dup2
后不关闭fd
,并且向fd
里写入hello world
会发现hello world
被打在了最前面,是因为有缓冲区的存在,先把系统调用里面的值打印出来,然后才是文件的值。
所以重定向的原理就是操作系统在源代码当中做操作系统级别的文件指针所对应的文件地址的拷贝!
1.3 进一步理解重定向
输出重定向:
int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);if(fd < 0) exit(1);//打开失败直接退出dup2(fd,1);//输出重定向,把本来打印到显示器上的内容,打印到fd中close(fd);
追加重定向:
int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);if(fd < 0) exit(1);//打开失败直接退出dup2(fd,1);//输出重定向,把本来打印到显示器上的内容,打印到fd中close(fd);
输入重定向:
int fd = open("log.txt",O_RDONLY);if(fd < 0) exit(1);//打开失败直接退出dup2(fd,0);//输出重定向,把本来打印到显示器上的内容,打印到fd中close(fd);while(1){char buffer[64];if(!fgets(buffer,sizeof(buffer),stdin)) break;printf("%s",buffer);}
重定向 = 打开文件的方式 + dup2
任何文件的输出重定向:
int main(int argc,char * argv[])
{if(argc != 2) exit(1);int fd = open(argv[1],O_RDONLY);if(fd < 0) exit(1);//打开失败直接退出dup2(fd,0);//输出重定向,把本来打印到显示器上的内容,打印到fd中close(fd);while(1){char buffer[64];if(!fgets(buffer,sizeof(buffer),stdin)) break;printf("%s",buffer);}return 0;
}
把本来从标准输入(stdin)上获取的数据,从文件里读,此时就可以做任意文件的输入重定向。
我们用fd
把标准输出覆盖后,那么标准输出去哪里了呢?一个文件可以被多个进程打开,文件的struct file
中有引用计数cnt
,当一个进程关闭文件时,引用计数--
,当引用计数减到0
,这个struct file
才会被关掉。
所以当我们把fd
拷贝到1
这个位置时,首先会把stdout
的引用计数做--
,操作系统会判断这个引用计数是否为0
,为0
就会把它释放掉。
重定向的完整写法:
标准输出和标准错误
为什么我们的标准输出写进了log.txt
里,而标准错误还是在显示器上打印?原因是我们标准输出的时候,虽然标准输出和标准错误都指向同一份文件,我们重定向时,它的本质是把1
重定向到新文件,即把新打开的log.txt
文件描述符的地址拷贝到1
里面,可是2
依旧指向标准错误。
但我们如果想让标准输出和标准错误打印在不同的文件里,我们可以
./a/out 1>log.normal 2>log.error
因此我们可以通过重定向未来把常规消息和错误消息进行分离
如果我们想把标准输出和标准错误打印到同一个文件呢?有的同学肯定会想./a.out 1>lg.normal 2>log.normal
,最后文件中只有标准错误的信息,原因是这个文件被打开了两次,打开文件时是先清空再写入,所以最后就只剩标准错误的信息了。
有一个解决办法是./a.out 1>lg.normal 2>>log.normal
,使用追加的方式。
还有一个办法就是
./a.out 1>log.txt 2>&1
其中2>&1
表示的是把1
里面的内容写到2
里面,1>log.txt
表示把log.txt
里面的内容写到1
里面,即把3
写到1
里面。把1
里面的内容写到2
里面,因为1
里面的内容已经被重定向成log.txt
了,把1
里面的内容写到2
,所以2
此时也指向log.txt
,两个就指向同一个文件了。
二. 理解一切皆文件
像磁盘、显示器、键盘,鼠标,网卡这样硬件设备也被抽象成了文件,这些外设都要有自己的读写方法,每一种设备的读写方法都是不一样的。操作系统是对软硬件资源进行管理的,但操作系统并不和这写硬件设备打交道,但操作系统要把这些硬件设备先描述,再组织地管理起来,所以操作系统对设备的管理就转换成了对链表的增删查改。一个进程在打开文件时要创建PCB
,通过文件描述符表找到对应的struct file
,struct file
结构体中虽然不能存在函数方法,但可以有函数指针,通过函数指针执行对应硬件的读写方法。相当于C语言实现的多态。
我们用户在上层通过文件描述符访问特定文件时,比如说read
接口 把上层的数据拷贝到文件缓冲区里,做刷新把内容从文件缓冲区中调用对应的函数指针的write
方法写到设备里。所以访问设备都是通过函数指针进行访问的,而大家的函数指针类型名,参数都一样。
所以上层访问底层不同的硬件设备时,上层就不需要知道你是磁盘,显示器,还是鼠标了,就屏蔽了底层的硬件差异。
因此把struct file
以上统称为一切皆文件。把struct file
这一层称之为虚拟文件系统(VFS)
📙总结: 一切皆文件是通过VFS
即虚拟文件系统来实现的,我们用到的struct file
属于虚拟文件系统而不属于具体的文件系统,对我们来说VFS
中有文件的基本属性,缓冲区,函数指针。这样就可以通过函数中指针屏蔽掉底层不同的差异。
三. 缓冲区
3.1 什么是缓冲区
缓冲区是内存空间的一部分,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备分为输入缓冲区和输出缓冲区。相当于"菜鸟驿站“。
3.2 为什么要引入缓冲区
为了减少使用系统调用的次数,提高效率,我们就可以采用缓冲机制。
先看现象:
此时默认会往log.txt
中打印
我们在打印之后把fd
关掉。
此时我们会发现log.txt
的大小为0
我们用系统调用write
加上一段字符串,此时的fd
是没关的
我们会发现内容全被写进来了
当我们关闭fd
我们会发现只有系统调用写进了文件里,而库函数并没有被写入。
现象发生的原因:
这下我们就懂得了打开close
语言层库函数的内容为什么没有打印到文件里了,当我们调用close
时进程还没有结束,因为还没执行到return
,我们的语言层既没有强制刷新
,刷新条件满足
,进程退出
,所以数据会一直在C语言标准库中的语言层缓冲区中。后来close
把文件描述符关了,进程退出了,进程退出之后C语言语言层缓冲区要刷新,调系统调用时发现fd
已经被关了,所以无法把数据从语言层交付到操作系统内,所以数据也无法从文件内核缓冲区刷新到某种硬件上,所以我们就看不到写的内容。
我们如果想在进程退出之前刷新到文件内核缓冲区呢?fflush
💦补充细节: c语言层的缓冲区在哪里?
我们使用的printf/fprintf/fputs/fwrite
的底层都是FILE*
的 ,FILE
是c语言提供的一个结构体,里面封装了fd
和缓冲区,现在就能理解了为什么任何文件都要都一个缓冲区,因为任何一个文件被打开都要有一个FILE*
对象。
数据交给系统交给硬件本质全是拷贝!
计算机数据流动的本质:一切皆拷贝!
再来看一个现象:
为什么往显示器上打印的时候只有四条,而往文件中打印时有七条呢,系统调用只打了一次,而库函数打印了两次?
原因是在fork
的时候,对应语言层缓冲区里面的消息还在缓冲区里,当fork
的时候父子各自都要刷新,所以就会出现两次。
那系统调用为什么没有出现刷新两次的问题呢?
答案是write
执行完后,数据已经写给操作系统了,不存在用户层的刷新问题。
📙总结: 对于写入来讲,用户把自己的字符串拷贝到缓冲区里,就可以通过缓冲区的存在大大减少调用系统调用的次数,提高c语言接口的使用效率。系统内核也存在文件内核缓冲区,文件内核缓冲区可以提高系统调用的效率
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔
相关文章:
【Linux篇】基础IO - 揭秘重定向与缓冲区的管理机制
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 一. 理解重定向1.1 理解重定向1.2 dup21.3 进一步理解重定向输出重定向:追加重定向…...
centos 8 启动Elasticsearch的时候报内存不足问题解决办法
centos 8 启动Elasticsearch 的时候报错,导致无法启动Elasticsearch 。 [root@CentOS-8 ~]# journalctl -xe Apr 07 18:25:56 CentOS-8.0 kernel: [ 8754] 0 8754 3180 63 69632 0 0 sh Apr 07 18:25:56 CentOS-8.0 kernel: [ 8755] 0 8755 3180 64 69632 0 0 sh Apr 07 18:25…...
深入剖析Java IO设计模式:从底层原理到实战应用
🔍 引言:设计模式与IO的完美交响 在软件开发的浩瀚星河中,设计模式犹如璀璨的导航星,而Java IO体系则是支撑数据流动的神经网络。 当我们以设计模式的视角重新审视Java IO库时,会发现这个看似平凡的IO世界实则暗藏着…...
阶段测试 【过程wp】
分享总结: 回顾起来,真的感慨很多呀。看着并不难啊,但难的是解题思维:如何判断该页面的关键点,快速地确定问题的核心,找到对应的解决方法。达到便捷、高效的得到结果。我们做了整整近七个半小时。在这个过程中,我发现自己的思维钝化,不太能自主高效地划分判断漏洞类型,…...
qml信号与槽函数
目录 信号与槽函数基础方法1-使用Connections方式2-使用connect(不常用) 自定义组件与信号槽使用 信号与槽函数基础 方法1-使用Connections main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {id:windoww…...
ngx_palloc
定义在 src\core\ngx_palloc.c void * ngx_palloc(ngx_pool_t *pool, size_t size) { #if !(NGX_DEBUG_PALLOC)if (size < pool->max) {return ngx_palloc_small(pool, size, 1);} #endifreturn ngx_palloc_large(pool, size); } 判断 需要分配的内存大小 是否小于 poo…...
notepad++日常使用(每行开头、每行末尾增加字符串,每行中间去掉字符串)
1. 每行开头增加字符串 如果我们要给下面的数据每行的开头都增加相同的一些字符串{value: 这时候只需要使用notepad的语法,使用快捷键Crtl H 替换功能,每一行开头使用 ^ 符号,替换成自己想要的字符串 {value: 使用全部替换就会在每行数据…...
Java面试黄金宝典39
1. SNMP、SMTP 协议 SNMP(简单网络管理协议) 定义:SNMP 是一种应用层协议,用于在 IP 网络中管理网络节点(如服务器、路由器、交换机等)。它允许网络管理员监控网络设备的状态、收集性能数据、进行故障诊断等操作。SNMP 基于 UDP 协议,采用轮询和事件驱动相结合的方式来收…...
如何解决:http2: Transport received Server‘s graceful shutdown GOAWAY
有一次做压力测试,客户端经常出现如下错误: http2: Transport: cannot retry err [http2: Transport received Servers graceful shutdown GOAWAY] after Request.Body was written; define Request.GetBody to avoid this error是 Golang 中使用 HTTP/…...
贪心算法(16)(java)俄罗斯套娃信封问题
题目:给你一个二维整数数组 envelopes ,其中 envelopes[i] [wi, hi] ,表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算…...
【DeepSeek原理学习2】MLA 多头隐变量注意力
解决的问题 Multi-Head Latent Attention,MLA——解决的问题:KV cache带来的计算效率低和内存需求大以及上下文长度扩展问题。 MLA原理 MLA原理:其核心思想是将键(Key)和值(Value)矩阵压缩到…...
2024年RAG大赛
2024 CCF国际AIOps挑战赛赛题与赛制解读-CSDN博客 自动化测评也比较有意思,分数为 关键字 语义相似度,分值比为6:4. 2024 CCF AIOPS国际挑战赛优秀奖方案分享 https://zhuanlan.zhihu.com/p/7444390758 【大模型RAG获奖方案分享】如何提高RAG系统在…...
2025-4-6-C++ 学习 有序数组、set()的一些内置函数与求和函数
C的学习必须更加精进一些,对于好多的函数和库的了解必须深入一些。 文章目录 3510. 移除最小数对使数组有序 II(有序数组)题目参考代码(1)auto it idx.lower_bound(i);功能解释可能的使用场景常见错误 (2&…...
Flutter:Flutter SDK版本控制,fvm安装使用
1、首先已经安装了Dart,cmd中执行 dart pub global activate fvm2、windows配置系统环境变量 fvm --version3、查看本地已安装的 Flutter 版本 fvm releases4、验证当前使用的 Flutter 版本: fvm flutter --version5、切换到特定版本的 Flutter fvm use …...
GPT-4o 的“图文合体”是怎么做到的
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
PyTorch教程:如何读写张量与模型参数
本文演示了PyTorch中张量(Tensor)和模型参数的保存与加载方法,并提供完整的代码示例及输出结果,帮助读者快速掌握数据持久化的核心操作。 1. 保存和加载单个张量 通过torch.save和torch.load可以直接保存和读取张量。 import to…...
MySQL8.0.31安装教程,附pdf资料和压缩包文件
参考资料:黑马程序员 一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 我用夸克网盘分享了「mysql」,链接:https://pan.quark.cn/s/ab7b7acd572b 二、解…...
Linux 系统中对存储设备(/dev/mmcblk、/dev/sd、/dev/nvme)进行分区、格式化或挂载的操作
在 Linux 系统中对存储设备(/dev/mmcblk、/dev/sd、/dev/nvme)进行分区、格式化或挂载的操作步骤如下: 一、确认设备信息 首先明确要操作的设备名称(如 /dev/sdb、/dev/nvme0n1),避免误操作导致数据丢失&a…...
【Kafka基础】topics命令行操作大全:高级命令解析(1)
1 创建压缩主题(Log Compaction) /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-topics.sh --create \--bootstrap-server 192.168.10.33:9092 \--topic comtopic \--partitions 3 \--replication-factor 2 \--config cleanup.policycompact \--con…...
springboot集成spring loadbalancer实现客户端负载均衡
在 Spring Boot 中实现负载均衡,通常需要结合 Spring Cloud 组件,比如 Spring Cloud LoadBalancer。Spring Cloud LoadBalancer 是一个客户端负载均衡器,可以与 Spring Boot 集成,实现微服务之间的负载均衡。 以下是一个简单的示…...
什么是 k8s Affinity(亲和性)
在 Kubernetes(K8s)中,Affinity(亲和性) 是一种 Pod 调度策略,它用于控制 Pod 在什么条件下可以被调度到特定的节点上。它比 Taints 和 Tolerations 更灵活,可以基于 节点属性 或 Pod 之间的关系…...
深度探索:策略学习与神经网络在强化学习中的应用
深度探索:策略学习与神经网络在强化学习中的应用 策略学习(Policy-Based Reinforcement Learning)一、策略函数1.1 策略函数输出的例子 二、使用神经网络来近似策略函数:Policy Network ,策略网络2.1 策略网络运行的例子2.2需要的几个概念2.3神经网络近似…...
用VAE作为标题显示标题过短,所以标题变成了这样
VAE (Variational Autoencoder / 变分自编码器) 基本概念: VAE 是一种生成模型 (Generative Model),属于自编码器 (Autoencoder) 家族。 它的目标是学习数据的潜在表示 (Latent Representation),并利用这个表示来生成新的、与原始数据相似的数据。 与标…...
【day27】测试策略升级方案:需求阶段介入与业务规则覆盖矩阵设计
测试策略升级方案:需求阶段介入与业务规则覆盖矩阵设计 一、需求评审阶段:主动识别业务逻辑问题 在需求评审时,测试团队应通过结构化提问提前暴露潜在风险,避免后期返工。以下为提问框架与示例: 1. 业务逻辑澄清提问模…...
AI烘焙大赛中的算法:理解PPO、GRPO与DPO的罪简单的方式
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
二分 —— 基本算法刷题路程
一、1.求阶乘 - 蓝桥云课 算法代码: #include <bits/stdc.h> using namespace std; #define ll long long ll check(ll n) {ll cnt0;while(n){cnt(n/5);}return cnt; }int main() {ll k;cin>>k;ll L0,R1e19;while(L<R){ll mid(LR)>>1;if(che…...
内存序问题排查
1 内存序 2 简介 std::memory_order 是 C11 引入的一个枚举类型,用于和 <atomic> 原子操作一起使用,控制多线程环境下内存的可见性和执行顺序。 它的主要作用是:告诉编译器和 CPU,在执行某个原子操作时,哪些内…...
历年跨链合约恶意交易详解(四)——Chainswap20210711
漏洞合约函数 function receive(uint256 fromChainId, address to, uint256 nonce, uint256 volume, Signature[] memory signatures) virtual external payable {_chargeFee();require(received[fromChainId][to][nonce] 0, withdrawn already);uint N signatures.length;r…...
Johnson
理论 全源最短路算法 Floyd 算法,时间复杂度为 O(n)跑 n 次 Bellman - Ford 算法,时间复杂度是 O(nm)跑 n 次 Heap - Dijkstra 算法,时间复杂度是 O(nmlogm) 第 3 种算法被 Johnson 做了改造,可以求解带负权边的全源最短路。 J…...
spring boot + Prometheus + Grafana 实现项目监控
一、引入依赖 <dependencies><!-- Spring Boot Starter Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micrometer Reg…...
Mythical Beings:第八季即将回归,探索新的神话传承
Mythical Beings是由Tarasca Art & Games开发的、基于Ignis区块链的卡牌收集游戏。自发布以来,这款游戏以其独特的玩法和深厚的神话背景吸引了大量玩家的关注。每张卡牌不仅代表着独特的游戏属性,还融合了丰富的文化和神话故事,使玩家不仅…...
Linux中查看占用端口号的进程信息的方法
在 Linux 中查看占用 ** 端口(eg:1717)**的进程号(PID),可以通过以下命令实现: 方法 1:使用 netstat 命令 sudo netstat -tulnp | grep :1717参数解释: -t:查看 TCP 端口…...
批量将 txt/html/json/xml/csv 等文本拆分成多个文件
我们的文本文件太大的时候,我们通常需要对文本文件进行拆分,比如按多少行一个文件将一个大的文本文件拆分成多个小的文本文件。这样我们在打开或者传输的时候都比较方便。今天就给大家介绍一种同时对多个文本文件进行批量拆分的方法,可以快速…...
爱普生高精度车规晶振助力激光雷达自动驾驶
在自动驾驶技术快速落地的今天,激光雷达作为车辆的“智慧之眼”,其测距精度与可靠性直接决定了自动驾驶系统的安全上限。而在这双“眼睛”的核心,爱普生(EPSON)的高精度车规晶振以卓越性能成为激光雷达实现毫米级感知的…...
Spring Boot 自定义 Redis Starter 开发指南(附动态 TTL 实现)
一、功能概述 本 Starter 基于 Spring Boot 2.7 实现以下核心能力: Redis 增强:标准化 RedisTemplate 配置(JSON 序列化 LocalDateTime 支持)缓存扩展:支持 Cacheable(value “key#60s”) 语法动态设置 TTL配置集中…...
区分CRI、OCI、containerd、Docker、CRI-O、runc等名词概念
这些概念可以分为: 一、容器运行时Container Runtimes a、规范OCI (Open Container Initiative) 定义:OCI 是一个开放标准,用于定义容器格式和运行时的规范。它旨在确保容器镜像的格式和容器运行时的操作方式在不同的实现之间保持兼容性。 •…...
#关于process.env.NODE_ENV 与 import.meta.env 相关了解
process.env.NODE_ENV 在前端 Vue 项目中非常重要,但它其实是个“假象”,在前端它并不是原生就有的变量。下面我从多个角度来给你通俗讲明白它的由来和使用方式 👇 🌐 一、process.env.NODE_ENV 是干嘛用的? 这是 一个…...
R语言赋能气象水文科研:从多维数据处理到学术级可视化
全球气候变化加剧了极端天气与水文事件的复杂性,气象卫星、雷达、地面观测站及水文传感器每天产生TB级时空异质数据。传统研究常面临四大瓶颈: 数据清洗低效:缺失值、异常值处理耗时;时空分析模型构建复杂࿱…...
MySQL 约束(入门版)
目录 一、约束的基本概念 二、约束演示 三、外键约束 (一)介绍 (二)外键约束语法 (三)删除/更新行为 一、约束的基本概念 1、概念:约束是作用于表中字段上的规则,用于限制存储…...
【go】类型断言
接口-类型断言 Type Assertion Type Assertion(中文名叫:类型断言),通过它可以做到以下几件事情 检查 i 是否为 nil(是nil直接抛出panic)检查 i 存储的值是否为某个类型 具体的使用方式有两种ÿ…...
(复看)CExercise_06_1指针和数组_2 给定一个double数组,求平均值,并且返回
题目: 求平均值,给定一个double数组,求平均值,并且返回。 要求使用while循环遍历数组,然后配合"*p"的语法实现。 函数的声明如下: double get_ave(double *arr, int len); 关键点 分析࿱…...
Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行?
环境: Ubuntu 20.04 LTS 问题描述: Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行? bash docker/entrypoint.sh解决方案: bash docker/entrypoint.sh 脚本在后台运行&…...
ffmpeg提取字幕
使用ffmpeg -i test.mkv 获取视频文件的字幕流信息如下 Stream #0:4(chi): Subtitle: subrip (srt) (default) Metadata: title : chs Stream #0:5(chi): Subtitle: subrip (srt) Metadata: title : cht Stream #0:6(jpn)…...
深入理解Socket编程:构建简单的计算器服务器
一、Socket通信基础 1. Socket通信基本流程 服务器端流程: 创建Socket (socket()) 绑定地址和端口 (bind()) 监听连接 (listen()) 接受连接 (accept()) 数据通信 (read()/write()) 关闭连接 (close()) 客户端流程: 创建Socket (socket()) 连接…...
CPU狂飙900%,该怎么处理
首先,说明一下问题:CPU飙升200% 以上是生产容易发生的场景 场景:1:MySQL进程飙升900% 大家在使用MySQL过程,想必都有遇到过CPU突然过高,或者达到200%以上的情况。 数据库执行查询或数据修改操作时,系统需…...
C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避
🔮✨⚡️🌌 欢迎来到张有志的量子编程次元 🌌⚡️✨🔮 ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ 🛸 核心探索舱 🛸 ⇩⇩⇩ 正在加载未来代码 ⇩⇩⇩ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔…...
使用Pholcus编写Go爬虫示例
想用Pholcus库来写一个Go的爬虫程序。首先,我得确认Pholcus的当前状态,因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例,所以得先提供一个基本的框架。 首先,我应该回忆一下Pholcus的基本用法。Pholc…...
R Excel 文件:高效数据处理与可视化工具的完美结合
R Excel 文件:高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域,R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件,其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…...
Python设计模式:适配模式
1. 适配模式(Adapter Pattern)详解 适配模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一种接口。适配模式使得原本由于接口不兼容而无法一起工作的类可以协同工作。换句话说…...
Python设计模式:策略模式
1. 什么是策略模式 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说,策略模式允许在运…...