Linux中POSIX应用场景
Linux 提供了丰富的 POSIX(Portable Operating System Interface)标准接口,这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数,涵盖了文件操作、进程管理、线程管理、信号处理、同步机制等方面。
1. 文件操作
POSIX 提供了标准的文件操作接口,用于文件的创建、读取、写入、关闭等操作。
open(): 打开文件。close(): 关闭文件。read(): 从文件中读取数据。write(): 向文件中写入数据。lseek(): 移动文件指针。
#include <fcntl.h> // 包含文件控制相关的函数和宏定义,如 open()
#include <unistd.h> // 包含 POSIX 标准的系统调用,如 read(), write(), close(), lseek()
#include <iostream> // 包含标准输入输出流,如 std::coutint main() {// 打开文件 "example.txt",如果文件不存在则创建它// O_RDWR: 以读写模式打开文件// O_CREAT: 如果文件不存在则创建// 0644: 文件权限设置为用户可读写,组和其他用户只读int fd = open("example.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) { // 检查文件是否成功打开perror("open"); // 如果失败,打印错误信息return 1; // 返回错误码 1}// 要写入文件的字符串const char *text = "Hello, POSIX!";// 将字符串写入文件// fd: 文件描述符// text: 要写入的数据// 13: 写入的字节数(字符串长度)write(fd, text, 13);// 将文件指针移动到文件开头// fd: 文件描述符// 0: 偏移量// SEEK_SET: 从文件开头开始计算偏移量lseek(fd, 0, SEEK_SET);// 定义一个缓冲区,用于存储从文件中读取的数据char buffer[14];// 从文件中读取数据到缓冲区// fd: 文件描述符// buffer: 存储读取数据的缓冲区// 13: 读取的字节数read(fd, buffer, 13);buffer[13] = '\0'; // 在缓冲区末尾添加字符串结束符// 将读取的数据打印到标准输出std::cout << buffer << std::endl;// 关闭文件close(fd);return 0; // 程序正常结束
}
2. 进程管理
POSIX 提供了进程创建、终止、等待等接口。
fork(): 创建子进程。exec()系列函数: 执行新程序。wait()和waitpid(): 等待子进程结束。exit(): 终止进程。
#include <unistd.h> // 包含 POSIX 标准的系统调用,如 fork(), execlp()
#include <sys/wait.h> // 包含进程等待相关的函数,如 wait()
#include <iostream> // 包含标准输入输出流,如 std::coutint main() {// 创建一个子进程// fork() 返回两次:// - 在父进程中返回子进程的 PID// - 在子进程中返回 0// - 如果失败,返回 -1pid_t pid = fork();//父进程和子进程会从 fork() 之后开始并行执行。if (pid == 0) {// 子进程// 使用 execlp() 执行 "ls -l" 命令// execlp() 会用指定的程序替换当前进程的地址空间// "ls": 要执行的程序(在 PATH 中查找)// "ls": 传递给程序的第一个参数(通常是程序名)// "-l": 传递给程序的第二个参数(长格式显示)// nullptr: 参数列表的结束标志execlp("ls", "ls", "-l", nullptr);// 如果 execlp() 执行成功,以下代码不会被执行// 如果执行失败,会继续执行并打印错误信息perror("execlp");return 1; // 子进程异常退出} else if (pid > 0) {// 父进程// 等待子进程结束// wait() 会阻塞父进程,直到子进程退出// nullptr 表示不关心子进程的退出状态wait(nullptr);// 子进程结束后,打印提示信息std::cout << "Child process finished." << std::endl;} else {// fork() 失败perror("fork"); // 打印错误信息return 1; // 返回错误码 1}return 0; // 程序正常结束
}
3. 线程管理
POSIX 线程(Pthreads)提供了多线程编程的接口。
pthread_create(): 创建线程。pthread_join(): 等待线程结束。pthread_exit(): 终止线程。
#include <pthread.h> // 包含 POSIX 线程相关的函数和数据类型,如 pthread_create(), pthread_join()
#include <iostream> // 包含标准输入输出流,如 std::cout// 线程函数,新线程启动后执行的函数
void* thread_func(void* arg) {// 打印线程中的消息std::cout << "Hello from thread!" << std::endl;return nullptr; // 线程函数返回 nullptr,表示没有返回值
}int main() {pthread_t thread; // 定义一个线程标识符// 创建一个新线程// &thread: 用于存储新线程的标识符// nullptr: 使用默认的线程属性// thread_func: 线程启动后执行的函数// nullptr: 传递给线程函数的参数(这里没有传递参数)if (pthread_create(&thread, nullptr, thread_func, nullptr) != 0) {// 如果线程创建失败,打印错误信息并退出perror("pthread_create");return 1; // 返回错误码 1}// 等待线程结束// thread: 要等待的线程标识符// nullptr: 不关心线程的返回值pthread_join(thread, nullptr);// 线程结束后,打印提示信息std::cout << "Thread finished." << std::endl;return 0; // 程序正常结束
}
4. 信号处理
POSIX 提供了信号处理机制,用于处理异步事件。
signal(): 设置信号处理函数。sigaction(): 更复杂的信号处理设置。kill(): 发送信号给进程。
#include <csignal> // 包含信号处理相关的函数和常量,如 signal(), SIGINT
#include <unistd.h> // 包含 POSIX 标准的系统调用,如 sleep()
#include <iostream> // 包含标准输入输出流,如 std::cout// 信号处理函数
void signal_handler(int signum) {// 输出接收到的信号编号std::cout << "Received signal " << signum << std::endl;
}int main() {// 注册信号处理函数// 将 SIGINT 信号(通常是 Ctrl+C 触发的信号)与 signal_handler 函数绑定signal(SIGINT, signal_handler);// 无限循环,等待信号while (true) {std::cout << "Waiting for signal..." << std::endl;sleep(1); // 休眠 1 秒}return 0; // 程序正常结束(实际上不会执行到这里)
}
5. 同步机制
POSIX 提供了多种同步机制,如互斥锁、条件变量、信号量等。
pthread_mutex_t: 互斥锁。pthread_cond_t: 条件变量。sem_t: 信号量。
#include <pthread.h> // 包含 POSIX 线程相关的函数和数据类型,如 pthread_create(), pthread_mutex_t
#include <iostream> // 包含标准输入输出流,如 std::cout// 定义互斥锁
pthread_mutex_t mutex;// 定义共享数据
int shared_data = 0;// 线程函数
void* thread_func(void* arg) {// 加锁,确保对共享数据的访问是互斥的pthread_mutex_lock(&mutex);// 修改共享数据shared_data++;// 输出共享数据的值std::cout << "Shared data: " << shared_data << std::endl;// 解锁,允许其他线程访问共享数据pthread_mutex_unlock(&mutex);// 返回空指针return nullptr;
}int main() {// 定义两个线程标识符pthread_t thread1, thread2;// 初始化互斥锁// 第二个参数是互斥锁属性,这里使用默认属性,传入 nullptrpthread_mutex_init(&mutex, nullptr);// 创建第一个线程// pthread_create() 参数:// 1. 线程标识符// 2. 线程属性(默认属性,传入 nullptr)// 3. 线程函数// 4. 传递给线程函数的参数(这里不需要,传入 nullptr)pthread_create(&thread1, nullptr, thread_func, nullptr);// 创建第二个线程pthread_create(&thread2, nullptr, thread_func, nullptr);// 等待第一个线程结束// pthread_join() 会阻塞,直到指定线程结束// 第二个参数用于获取线程的返回值,这里不需要,传入 nullptrpthread_join(thread1, nullptr);// 等待第二个线程结束pthread_join(thread2, nullptr);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0; // 程序正常结束
}
6. 时间管理
POSIX 提供了时间相关的函数,用于获取和操作时间。
gettimeofday(): 获取当前时间。clock_gettime(): 获取更高精度的时间。sleep(): 让进程休眠指定时间。
#include <sys/time.h> // 包含时间相关的函数和数据结构,如 gettimeofday()
#include <unistd.h> // 包含 POSIX 标准的系统调用,如 sleep()
#include <iostream> // 包含标准输入输出流,如 std::coutint main() {// 定义两个 timeval 结构体,用于存储时间点struct timeval start, end;// 获取当前时间,并存储到 start 中// gettimeofday() 获取从 1970-01-01 00:00:00 UTC 到当前时间的秒数和微秒数// 第二个参数是时区信息,这里不需要,传入 nullptrgettimeofday(&start, nullptr);// 让程序休眠 2 秒sleep(2);// 获取当前时间,并存储到 end 中gettimeofday(&end, nullptr);// 计算时间差long seconds = end.tv_sec - start.tv_sec; // 计算秒数差long microseconds = end.tv_usec - start.tv_usec; // 计算微秒数差// 将时间差转换为秒(包括微秒部分)double elapsed = seconds + microseconds / 1e6; // 1e6 表示 1,000,000,将微秒转换为秒// 输出耗时std::cout << "Elapsed time: " << elapsed << " seconds" << std::endl;return 0; // 程序正常结束
}
7. 网络编程
POSIX 提供了套接字(socket)接口,用于网络编程。
socket(): 创建套接字。bind(): 绑定套接字到地址。listen(): 监听连接。accept(): 接受连接。connect(): 连接到服务器。send()和recv(): 发送和接收数据。
#include <sys/socket.h> // 包含套接字相关的函数和数据结构,如 socket(), bind(), listen(), accept()
#include <netinet/in.h> // 包含 IPv4 地址结构体 sockaddr_in 和相关的常量,如 INADDR_ANY
#include <unistd.h> // 包含 POSIX 标准的系统调用,如 close()
#include <iostream> // 包含标准输入输出流,如 std::cout
#include <cstring> // 包含字符串操作函数,如 strlen()int main() {// 创建一个套接字// AF_INET: 使用 IPv4 地址族// SOCK_STREAM: 使用面向连接的 TCP 协议// 0: 默认协议(TCP)int server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {// 如果套接字创建失败,打印错误信息并退出perror("socket");return 1; // 返回错误码 1}// 定义服务器地址结构struct sockaddr_in address;address.sin_family = AF_INET; // 使用 IPv4 地址族address.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用的网络接口address.sin_port = htons(8080); // 绑定到端口 8080,htons() 将端口号转换为网络字节序// 将套接字绑定到指定的地址和端口if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {// 如果绑定失败,打印错误信息并退出perror("bind");return 1; // 返回错误码 1}// 开始监听连接请求// 3: 最大等待连接队列的长度if (listen(server_fd, 3) < 0) {// 如果监听失败,打印错误信息并退出perror("listen");return 1; // 返回错误码 1}// 接受客户端的连接请求// 返回一个新的套接字,用于与客户端通信// 后两个参数用于获取客户端的地址信息,这里不需要,因此传入 nullptrint new_socket = accept(server_fd, nullptr, nullptr);if (new_socket < 0) {// 如果接受连接失败,打印错误信息并退出perror("accept");return 1; // 返回错误码 1}// 向客户端发送消息const char *message = "Hello from server!";send(new_socket, message, strlen(message), 0);// 关闭与客户端的连接close(new_socket);// 关闭服务器套接字close(server_fd);return 0; // 程序正常结束
}
相关文章:
Linux中POSIX应用场景
Linux 提供了丰富的 POSIX(Portable Operating System Interface)标准接口,这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数,涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...
量子算法导论
重学了量子算法,不知道是温故而知新,还是之前的教材没有讲过这个概念。 如果把(图灵机)计算机比作一个查询机器,输入x通过f(x)作用得出结果,而查询的过程就是计算的过程。 中文解释…...
nasm - BasicWindow_64
文章目录 nasm - BasicWindow_64概述笔记my_build.batnasm_main.asmEND nasm - BasicWindow_64 概述 学习网上找到的demo. x64和x86的汇编源码还差挺多的。 x64的汇编代码不好写,细节整不对,程序就不运行。 如果要查为啥不运行,也要看和正向…...
SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问
一、前言 SSL协议介于TCP/IP协议栈的第四层(传输层)和第七层(应用层)之间,为基于TCP的应用层协议(如HTTP)提供安全连接。它通过在客户端和服务器之间建立一个加密的通道,确保数据在传…...
selenium爬取苏宁易购平台某产品的评论
目录 selenium的介绍 1、 selenium是什么? 2、selenium的工作原理 3、如何使用selenium? webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么? 用于Web应用程序测试的工具。可以驱动浏览…...
Spark提交任务
1、Spark提交任务到Yarn 1.1、DwKuduApp spark-submit --class com.io.etl.dwkudu.DwKuduApp \ --files /etl/etl-dwkudu/conf/doris.property,/etl/etl-dwkudu/conf/redis.property,/etl/etl-dwkudu/conf/log4j.property \ --master yarn --deploy-mode cluster \ --driver-…...
游戏引擎学习第113天
仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:优化的基本过程 在游戏编程中,优化是一个非常重要的学习内容,尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度,以及如何提升其性能。在这个阶段,已经…...
token是什么
在自然语言处理(NLP)和机器学习的背景下,token 是指模型在处理文本时的最小单位。通常,这个单位可以是单词、字符,或者词的一部分。具体来说,token 的定义取决于你使用的模型和它的分词方式。 举个例子&am…...
23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成
文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台(已集成 DeepSeek 大模型)1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...
IPv6报头40字节具体怎么分配的?
目录 IPv6报头结构 字段详解 示例代码:IPv6报头的Python实现 输出示例 IPv6协议是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。与IPv4相比,IPv6不仅提供了更大的地址空间,还简化了报头结构,提高了网络设备的处理效率。…...
驱动开发、移植
一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...
BFS与Flood Fill:算法原理、实现细节与复杂度分析
目录 1. 概述 2. BFS 的基本原理 3. Flood Fill 算法 4. BFS 实现 Flood Fill 的步骤 5. C 实现 6. 代码解析 7. 复杂度分析 8. 应用场景 总结 1. 概述 Flood Fill 算法是一种用于填充封闭区域的算法,常用于图像处理、绘图工具和游戏开发中。BFS(…...
计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)
目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…...
雷龙CS SD NAND(贴片式TF卡)测评体验
一、产品概述 近期获赠雷龙科技(Longsto)推出的CS系列贴片式SD NAND存储解决方案,包含两片工业级贴片式NAND芯片(CSNP16GCR01-AOW)及全兼容转接板。该方案支持TF卡形态扩展,实现高可靠性嵌入式存储应用。 …...
【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
Java——权限修饰符
一、权限修饰符的继承访问规则 以下按访问范围从宽到窄排序: 修饰符同包同类同包子类同包非子类跨包子类跨包非子类public✔️✔️✔️✔️✔️protected✔️✔️✔️✔️❌默认(包级)✔️✔️✔️❌❌private✔️❌❌❌❌ 关键点…...
一周学会Flask3 Python Web开发-redirect重定向
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学过渲染到模板页面,这个其实是一种内部的转发,浏览器地址栏地址没有变化。如果我们想重定向…...
python面向对象:方法
1. 实例方法 实例方法用于操作实例变量,必须包含 self 参数。 class Person:def __init__(self, name):self.name namedef greet(self):print(f"Hello, my name is {self.name}")person1 Person("Alice") person1.greet() # 输出ÿ…...
物联网简介集合
物联网(IoT)指的是物理设备(如电器和车辆)之间的互联互通。这些设备嵌入了软件、传感器和连接功能,使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据,为打造更高效、自动化的系…...
centos下使用pyenv管理python版本
在 CentOS 上安装 pyenv 和 pyenv-virtualenv,可以按照以下步骤进行操作: ps: centos7 最高适配到3.9.* 步骤 1:安装依赖 首先,确保你的系统中安装了必需的依赖项。你可以使用以下命令安装它们: [root ~]# yum gro…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
