当前位置: 首页 > news >正文

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&#xff08;Portable Operating System Interface&#xff09;标准接口&#xff0c;这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数&#xff0c;涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...

量子算法导论

重学了量子算法&#xff0c;不知道是温故而知新&#xff0c;还是之前的教材没有讲过这个概念。 如果把&#xff08;图灵机&#xff09;计算机比作一个查询机器&#xff0c;输入x通过f&#xff08;x&#xff09;作用得出结果&#xff0c;而查询的过程就是计算的过程。 中文解释…...

nasm - BasicWindow_64

文章目录 nasm - BasicWindow_64概述笔记my_build.batnasm_main.asmEND nasm - BasicWindow_64 概述 学习网上找到的demo. x64和x86的汇编源码还差挺多的。 x64的汇编代码不好写&#xff0c;细节整不对&#xff0c;程序就不运行。 如果要查为啥不运行&#xff0c;也要看和正向…...

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层&#xff08;传输层&#xff09;和第七层&#xff08;应用层&#xff09;之间&#xff0c;为基于TCP的应用层协议&#xff08;如HTTP&#xff09;提供安全连接。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传…...

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么&#xff1f; 2、selenium的工作原理 3、如何使用selenium&#xff1f; webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么&#xff1f; 用于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 黑板&#xff1a;优化的基本过程 在游戏编程中&#xff0c;优化是一个非常重要的学习内容&#xff0c;尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度&#xff0c;以及如何提升其性能。在这个阶段&#xff0c;已经…...

token是什么

在自然语言处理&#xff08;NLP&#xff09;和机器学习的背景下&#xff0c;token 是指模型在处理文本时的最小单位。通常&#xff0c;这个单位可以是单词、字符&#xff0c;或者词的一部分。具体来说&#xff0c;token 的定义取决于你使用的模型和它的分词方式。 举个例子&am…...

23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成

文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台&#xff08;已集成 DeepSeek 大模型&#xff09;1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...

IPv6报头40字节具体怎么分配的?

目录 IPv6报头结构 字段详解 示例代码&#xff1a;IPv6报头的Python实现 输出示例 IPv6协议是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。与IPv4相比&#xff0c;IPv6不仅提供了更大的地址空间&#xff0c;还简化了报头结构&#xff0c;提高了网络设备的处理效率。…...

驱动开发、移植

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; 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 算法是一种用于填充封闭区域的算法&#xff0c;常用于图像处理、绘图工具和游戏开发中。BFS&#xff08…...

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备&#xff0c;换句话说&#xff0c;没有交换机就没法搭建局域网 交换机不能让局域网连…...

雷龙CS SD NAND(贴片式TF卡)测评体验

一、产品概述 近期获赠雷龙科技&#xff08;Longsto&#xff09;推出的CS系列贴片式SD NAND存储解决方案&#xff0c;包含两片工业级贴片式NAND芯片&#xff08;CSNP16GCR01-AOW&#xff09;及全兼容转接板。该方案支持TF卡形态扩展&#xff0c;实现高可靠性嵌入式存储应用。 …...

【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

Java——权限修饰符

一、权限修饰符的继承访问规则 以下按访问范围从宽到窄排序&#xff1a; 修饰符同包同类同包子类同包非子类跨包子类跨包非子类public✔️✔️✔️✔️✔️protected✔️✔️✔️✔️❌默认&#xff08;包级&#xff09;✔️✔️✔️❌❌private✔️❌❌❌❌ 关键点&#xf…...

一周学会Flask3 Python Web开发-redirect重定向

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们学过渲染到模板页面&#xff0c;这个其实是一种内部的转发&#xff0c;浏览器地址栏地址没有变化。如果我们想重定向…...

python面向对象:方法

1. 实例方法 实例方法用于操作实例变量&#xff0c;必须包含 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() # 输出&#xff…...

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…...

centos下使用pyenv管理python版本

在 CentOS 上安装 pyenv 和 pyenv-virtualenv&#xff0c;可以按照以下步骤进行操作&#xff1a; ps: centos7 最高适配到3.9.* 步骤 1&#xff1a;安装依赖 首先&#xff0c;确保你的系统中安装了必需的依赖项。你可以使用以下命令安装它们&#xff1a; [root ~]# yum gro…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...