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…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
