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

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;涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...

《动手学机器人学》笔记

目录 0.介绍1.概述&#xff5c;空间位置、姿态的描述&#xff08;33&#xff09;&#xff5c;《动手学机器人学》2.&#xff08;2&#xff09;-Robotics Toolbox①&#xff08;V10.4&#xff09;3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.&#xff08;轴角法&#xff09;…...

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候&#xff0c;用户会使用多个编辑器打开同一个文件&#xff0c;如果在A编辑器修改保存&#xff0c;但是B编辑器没有重新打开&#xff0c;直接在B编辑器修改再保存&#xff0c;则可能造成在A编辑器中修改的内容丢失&#xff0c;因此&#x…...

化学蛋白质组学与药物靶点筛选:DARTS、LiP-MS、TPP、CETSA技术的深度解析

更多详情请看&#xff1a;LiP-MS药物靶点筛选技术 在药物研发的复杂过程中&#xff0c;药物靶点的筛选是关键环节之一。化学蛋白质组学技术的出现&#xff0c;为药物靶点筛选提供了强大的工具&#xff0c;化学蛋白质组学是一门研究细胞或组织中全部蛋白质的化学组成、结构、功…...

如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈

使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈&#xff1a;详细分析与实战 在开发 Flutter 应用时&#xff0c;性能问题可能会导致用户体验下降&#xff0c;比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题&#xff0c;Flutter 提供了强大的性能监控工具…...

为AI聊天工具添加一个知识系统 之113 详细设计之54 Chance:偶然和适配 之2

本文要点 要点 祖传代码中的”槽“ &#xff08;占位符变量&#xff09; 和 它在实操中的三种槽&#xff08;占据槽&#xff0c;请求槽和填充槽&#xff0c; 实时数据库&#xff08;source&#xff09;中数据(流入 ETL的一个正序流程 行列并发 靶向整形 绑定变量 &#xff09…...

HTML5 面试题

1. HTML5 新增了哪些重要特性&#xff1f; 语义化标签&#xff1a;这些标签有助于提高页面的可读性和可维护性。多媒体支持&#xff1a;HTML5 引入了 和 标签&#xff0c;可以直接嵌入音频和视频文件&#xff0c;无需依赖插件。本地存储&#xff1a;引入了 localStorage 和 se…...

鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )

前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式&#xff0c;但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期&#xff0c;但是不支持在UIAbility的文件使用&#xff0c;简单而言就是不允许在UIAbility生命周期中…...

PINN求解一维burgers方程

PINN求解一维burgers方程 模型搭建网络与训练结果可视化对比实际结果 完整代码下载链接 PINN求解一维burgers方程 模型 搭建网络与训练 #########-------------- python求解一维burgers方程-------------------################## # -*- coding: utf-8 -*- import os os.envi…...

Linux系统配置阿里云yum源,安装docker

配置阿里云yum源 需要保证能够访问阿里云网站 可以先ping一下看看&#xff08;阿里云可能禁ping&#xff0c;只要能够解析为正常的ip地址即可&#xff09; ping mirrors.aliyun.com脚本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…...

Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位

需求如下&#xff1a; 项目 测试demo 有多个渠道&#xff0c;部分渠道包含支付功能&#xff0c;在主测试代码外&#xff0c;需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule&#xff0c;因此…...

【找工作】C++和算法复习(自用)

文章目录 C头文件自定义排序函数stl 算法树状数组 自用随便记录 C 排序 stl 头文件 全能头文件&#xff1a; #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map<int, strin…...

【相聚青岛】人工智能与材料国际学术会议即将召开

一、大会简介 人工智能与材料国际会议&#xff08;ICAIM 2025&#xff09; 官方网站&#xff1a;www.ic-aim.net 官方邮箱&#xff1a;icaim2025163.com 会议时间&#xff1a;2025年3.21-24 会议地点&#xff1a;中国青岛 会议检索&#xff1a;EI检索 截稿时间&#xff1a;2月…...

BFS 解决 FloodFill 算法(典型算法思想)—— OJ例题算法解析思路

目录 一、733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 算法思路 基础参数 函数入口 检查条件 初始化 BFS BFS 填充过程 返回结果 复杂度分析 总结 二、200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a;…...

纷析云开源版- Vue2-增加字典存储到localStorage

main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...

Python 爬虫selenium

1.selenium自动化 selenium可以操作浏览器&#xff0c;在浏览器页面上实现&#xff1a;点击、输入、滑动 等操作。 不同于selenium自动化&#xff0c;逆向本质是&#xff1a; 分析请求&#xff0c;例如&#xff1a;请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …...

【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍

这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…...

从面试中的“漏掉步骤”谈自我表达与思维方式的转变

在今天的面试中&#xff0c;我遇到了一个让我深刻反思自己思维方式的问题。当面试官问到如何应对用户量和请求量逐渐增加时&#xff0c;我的回答遗漏了一些基础步骤&#xff0c;导致我给出了“我暂时想不出更好的反思”的回答。这一经历让我意识到&#xff0c;在面对问题时&…...

大模型面经:SFT和RL如何影响模型的泛化或记忆能力?

监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术&#xff0c;像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤&#xff08;先SFT再RL&#xff0c;还是直接RL&#xff09;都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…...

力扣-回溯-17 电话号码的字母组合

思路 和之前的回溯不同的是&#xff0c;要遍历完所有的数字&#xff0c;并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...

大模型幻觉

1.什么是大模型幻觉? 在语言模型的背景下,幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性,本文将探讨大型语言模型(LLMs)的幻觉问题,以及解决幻觉现象的一些常见方法。 2.为什么需要解决LLM的…...

2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ /** * 冒泡法实现升序 */#include <stdio.h>int main() {int N, // 整数个数 6K, // 扫描遍数 2num, // 待排序的整数 2 3 5 1 6 4numArr[100], // 待排序的整数合集 2 3 5 1…...

RK3588配置成为路由器

文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口&#xff0c;一个无线网卡。我需要配置为家用路由器模…...

【数据挖掘】--算法

【数据挖掘】--算法 目录&#xff1a;1. 缺失值和数值属性处理1缺失值处理&#xff1a; 2. 用于文档分类的朴素贝叶斯3. 分治法&#xff1a;建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索&#xff08;Brute-Force Search&#xff09;kd树&am…...

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main&#xff08;可自定义&#xff09;&#xff0c;然后按下图创建文件&#xff0c;注意名称与文件夹名称保持一致 然后新建场景&#xff08;Init场景&#xff09;&#xff0c;添加3个空物体…...

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统&#xff08;完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料&#xff09;一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…...

ChromeDriver下载

平时为了下个驱动&#xff0c;到处找挺麻烦&#xff0c;收集了很多无偿分享给需要的人&#xff0c;仅供学习和交流。 ChromeDriver 102.0.5005.61 ChromeDriver 105.0.5195.102 ChromeDriver 108.0.5359.71 ChromeDriver 111.0.5563.64 ChromeDriver 116.0.5845.97 Chrom…...