POSIX(包含程序的可移植性) -- 详解

1. 什么是 POSIX

参考链接–知乎

POSIX 标准包含了进程管理、文件管理、网络通信、线程和同步、信号处理等方面的功能。
这些接口定义了函数、数据类型和常量等,为开发者提供了一个可移植的方法来与操作系统进行交互。

2. 谁遵守这个标准

遵守 POSIX 标准的主要是 C 实现相关的程序,如操作系统或 C 标准库函数。

2.1 操作系统

操作系统利用 POISX 定义一组通用的 API,将底层操作系统的功能封装起来,从而提供了与具体操作系统无关的高级功能。
即操作系统的 POSIX API 是面向底层硬件的。旨在让用户开发应用程序更方便与硬件交互。

Unix 和 Linux、苹果的Mac OS X、win10 等等都存在 POSIX 标准的系统调用函数。

  • 利用 POSIX 函数开发程序示例:
    1. 利用 linux 下 POSIX 标准的进程管理相关函数做了一个程序
    2. 将该程序移植到另一个支持 POSIX 的系统上后(如移植到 WIN10),该程序可能不能正常运行
    3. 分析原因:实现了 POSIX 标准的各个操作系统都有相同的函数结构(结构,返回值等),可以通过 POSIX 标准去理解不同操作系统的同类函数,但命名可能不一样,但肯定存在功能相同的一个函数,需要调整后才能实现跨平台。

2.2 库函数

库函数也分为两类:

一类是 C 语言标准规定的库函数
一类是编译器特定的库函数。

(由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口)

库函数是语言或应用程序的一部分,而系统调用属于系统的一部分。

2.2.1 C 标准库函数

glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。这些基本函数都是被标准化了的,而且这些函数通常都是用汇编直接实现的。
系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便

  • 下图是 C 标准库函数和系统调用间的关系图
    在这里插入图片描述

    库函数调用与系统无关,不同的系统,调用库函数,库函数会调用不同的底层函数实现,因此可移植性好。

2.2.2 程序的可移植性实现

因为系统调用是最底层的,不太可能在这一层去实现可移植性, 故我们应该在代码层去实现。

  • 如 C语言标准库 glibc,该库封装屏蔽了调用操作系统 API 的细节,故程序的可移植性可以通过标准库这个中间层来实现。
    • 示例 1
      例如在我们的代码中下功夫。以下代码可以帮助我们实现各平台之间的可移植:
      #ifdef _WINDOWS_CreateThread();      //windows下线程的创建
      #elsePthread_create();    //Linux下线程的创建
      #endif
      
    • 示例 2
      对于头文件,也使用同样的预编译宏来实现。如:
      #ifndef _WINDOWS_#include <windows.h>
      #else#include <thread.h>
      #endif
      
    • 在编译的时候只要通过 #define 就可以选择在那个平台下完成程序的编译。

综上所述,我们都是将C,C++等各种语言当作中间层,以实现其一定程度上的可移植。如今,语言的跨平台的程序都是以这样的方式实现的。但是在不同的平台下,仍需要重新编译。

3. 库函数 和 系统调用间关系图

以 printf() 函数调用为例:
printf 函数执行过程中,程序运行状态切换如下:

用户态 –> 系统调用 –> 内核态 –> 返回用户态

在这里插入图片描述
实例代码如下:

#include <stdio.h>int main(int argc, char **argv)
{printf(yikoulinux);   return 0;
}   

编译执行

root@ubuntu:/home/peng/test# gcc 123.c -o run
root@ubuntu:/home/peng/test# strace ./run

注意:运行程序前加上 strace,可以追踪到函数库调用过程,得到结果如下图
在这里插入图片描述
如执行结果可知: 我们的程序虽然只有一个 printf 函数,但是在执行过程中,我们前后调用了 execve、access、open、fstat、mmap、brk、write 等系统调用。 其中 write 系统调用会把字符串:yikoulinux 通过设备文件 1,发送到驱动,该设备节点对应终端 stdout。

4. 遵循 POSIX 标准的好处

最大好处就是可以开发出可移植性强的程序(通常利用的是 C 语言标准库函数)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蛋氨酸市场调研:预计2029年将达到87亿美元

蛋氨酸&#xff0c;又名甲硫氨酸&#xff0c;化学名称为γ-甲硫基-a-氨基丁酸&#xff0c;是一种参与蛋白质合成的基本结构单位&#xff0c;是人体内八种必需氨基酸之一&#xff0c;同时也是重要的饲料添加剂。蛋氨酸主要用于家禽、猪的饲料添加剂以及药用等。对禽类来说&#…

adb脚本操作

用荣耀80手机测试 echo off setlocal enabledelayedexpansion adb shell am start com.android.settings timeout /t 2 /nobreak >nul adb shell input tap 500 1300 timeout /t 2 /nobreak >nul adb shell input tap 500 800 timeout /t 2 /nobreak >nul adb she…

ElasticSearch搜索与分析引擎-Linux离线环境安装教程

目录 一、下载安装包 网盘链接: 二、安装流程及遇到的问题和解决方案 &#xff08;1&#xff09;JDK安装 &#xff08;2&#xff09;Elasticsearch安装 &#xff08;3&#xff09;Kibana安装 ​&#xff08;4&#xff09;Ik分词器安装 三、启动过程中的问题 &#xff…

linux查看mysql状态重启

1.linux怎么看mysql数据库是不是宕机了&#xff1f; MySQL/MariaDB数据库的状态&#xff1a;使用systemctl status mysql或者service mysqld status命令。如果显示"active (running)"表示MySQL正常运行&#xff1b;如果显示"inactive (dead)"则表示MySQL已…

C语言系列-联合

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 联合体 联合体类型的声明 联合体的特点 相同成员的结构体和联合体对比 联合体大小的计算 联合的一个练习 联合体 联合体类型的声明 像结构体一样&#xff0c;联合体也是由…

NLP深入学习(十二):支持向量机(SVM)

文章目录 0. 引言1. 什么是支持向量机2. 线性 SVM3. 非线性 SVM3.1 推导过程3.2 常用核函数 4. 参考 0. 引言 前情提要&#xff1a; 《NLP深入学习&#xff08;一&#xff09;&#xff1a;jieba 工具包介绍》 《NLP深入学习&#xff08;二&#xff09;&#xff1a;nltk 工具包…

C语言·贪吃蛇游戏(上)

1. 游戏任务 使用C语言在Windows环境的控制台中模拟实现小游戏贪吃蛇 游戏中要包含以下功能&#xff1a; 1. 贪吃蛇地图绘制 2. 贪吃蛇上下左右移动和吃食物 3. 蛇撞墙&#xff0c;或撞到自身死亡 4. 计算得分 5. 蛇身加速、减速 6. 暂停游戏 2. Win32 API 介绍 Windows是一种多…

云原生之可观测性-APM概念及选型

导读&#xff1a;为了让大家更好的 APM 系统的设计实现&#xff0c;我将在公众号编写《云原生之可观测性》系列文章&#xff0c;深入讲解 APM 系统的产品设计、架构设计和基础技术。APM是一个庞杂的技术体系&#xff0c;涉及到很多开源技术&#xff0c;欢迎大家留言讨论。 本文…

python中的异步实践与tornado应用

最近项目中由于在python3中使用tornado,之前也有用过&#xff0c;是在python2中&#xff0c;由于对于协程理解不是很透彻&#xff0c;只是套用官方文档中的写法&#xff0c;最近比较细致的看了下协程的用法&#xff0c;也将tornado在python3中异步的实践了一下。 异步基础 要…

[香橙派开发系列]使用蓝牙和手机进行信息的交换

文章目录 前言一、HC05蓝牙模块1.HC05概述2.HC05的连接图3.进入HC05的命令模式4.常用的AT指令4.1 检查AT是否上线4.2 重启模块4.3 获取软件版本号4.4 恢复默认状态4.5 获取蓝牙的名称4.6 设置蓝牙模块的波特率4.7 查询蓝牙的连接模式4.8 查询模块角色 5.连接电脑6.通过HC05发送…

2024美赛MCM Problem A: Resource Availability and Sex Ratios资源可用性和性别比例 完整代码以及思路分享

虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。例如&#xff0c;美洲短吻鳄孵化卵的巢穴的温度会影…

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…

Git解决分支合并冲突的问题:分支合并提交出现了不同分支同一个文件的修改的冲突解决

有些时候我们合并分支的时候&#xff0c;会出现冲突&#xff0c;原因就是我们修改了分支A 的第一行代码&#xff0c;我们还修改了主分支上面同一个文件中的第一行代码&#xff08;分支A已经提交过一次&#xff09;&#xff0c;此时我们在次合并的时候就会出现冲突&#xff0c;需…

智慧养老成关键力量,全视通智慧机构养老解决方案来助力

近日&#xff0c;国新办举行国务院政策例行吹风会&#xff0c;国家发展改革委、工业和信息化部、民政部、商务部有关负责人介绍《关于发展银发经济增进老年人福祉的意见》有关情况并答记者问。 会上&#xff0c;民政部养老服务司负责人李永新透露&#xff0c;将发展智慧养老服务…

tidb节点重启后,服务无法重连

大家好&#xff0c;我是烤鸭&#xff1a; 前几天遇到tidb节点重启后服务无法重连&#xff0c;确切地说是两个服务&#xff0c;一个可以正常重连&#xff0c;一个不行。 问题复现 由于线上执行慢SQL&#xff0c;导致TiDB 单个节点宕机重启。 其中A服务的3个节点和B服务的1个节…

Sketch使用手册:从入门到精通的完整教程

Sketch软件是Mac平台上流行的矢量图形编辑软件&#xff0c;旨在帮助用户创建网站、移动应用、图标等各种设计原型。Sketch软件的设计风格简洁明了&#xff0c;界面操作简单易用&#xff0c;非常适合UI/UX设计师、平面设计师等数字创意人员。本文将根据如何使用Sketch&#xff0…

IEPE数据采集卡的作用说明

IEPE传感器是一种特殊的加速度传感器&#xff0c;其特点是自带电量放大器或电压放大器。这种传感器产生的电信号非常微弱&#xff0c;很容易受到噪声干扰&#xff0c;因此需要使用灵敏的电子器件进行放大和信号调理。为了实现更好的抗噪声性能和更方便的封装&#xff0c;IEPE传…

xmind思维导图 for mac v24.01中文版

mac电脑上思维导图软件哪个好呢&#xff1f; xmind for mac一个功能强大、易于使用的思维导图软件&#xff0c;够帮助你更好地组织思维、管理信息、规划项目和解决问题&#xff0c;提高个人和团队的工作效率。 软件下载&#xff1a;xmind思维导图 for mac v24.01中文版 XMind f…

数据可视化工具选择指南:六款主流工具的综合评测

随着大数据时代的来临&#xff0c;数据可视化已成为各行业不可或缺的工具。本文将为您介绍市面上六款主流数据可视化工具&#xff0c;包括山海鲸可视化、Echarts、D3.js、Tableau、Power BI和Funnel.io&#xff0c;帮助您更好地了解并选择适合您的工具。 山海鲸可视化 山海鲸…

【Django开发】美多商城项目第2篇:Django用户注册和登录开发(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现前后端…