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…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
