POSIX与程序可移植性

目录

一、系统调用和库函数

1、系统调用

2、库函数

二、程序的可移植性及其本质

三、系统开销

 四、POSIX

1、定义

2、历史

3、谁来遵循


一、系统调用和库函数

1、系统调用

系统调用通向操作系统本身的接口,是面向底层硬件的。通过系统调用,可以使得用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互,是操作系统留给应用程序的一个接口。

2、库函数

库函数(Library function)是把函数放到库里,供别人使用的一种方式。

方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。一般放在.lib文件中。

库函数调用则是面向应用开发的,库函数可分为两类,

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

3、库函数API和系统调用的区别

  • (1) 库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分
  • (2) 库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
  • (3) 系统调用依赖于平台,库函数并不依赖

系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便。

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

系统调用和库函数是上下层关系,库函数是用户对系统调用的进一步封装,库函数对硬件操作时,会调用系统提供的API。

二、程序的可移植性及其本质

编程语言编写的程序首先要被编译器编译成目标代码(0、1代码),然后在目标代码的前面插入启动代码,最终生成了一个完整的程序。

程序中为访问特定设备(如显示器)或者操作系统(如windows xp 的API)的特殊功能而专门编写的部分通常是不能移植的。

一个编程语言的可移植性取决于

  1. 不同平台编译器的数量
  2. 对特殊硬件或操作系统的依赖性

移植是基于操作系统的。但是这个时候,我们需要注意一点:基于各种操作系统平台不同,应用程序在二级制级别是不能直接移植的。

在API层面上由于各个操作系统的命名规范、系统调用等自身原因,在API层面上实现可移植是不大可能的。

在代码层去思考可移植问题,

在各个平台下,我们默认C标准库中的函数都是一样的,这样基本可以实现可移植。但是对于C库本身而言,在各种操作系统平台下其内部实现是完全不同的,也就是说C库封装了操作系统API在其内部的实现细节。

因此,C语言提供了我们在代码级的可移植性,即这种可移植是通过C语言这个中间层来完成的。

例如在我们的代码中下功夫。以下代码可以帮助我们实现各平台之间的可移植:

#ifdef _WINDOWS_CreateThread();      //windows下线程的创建
#elsePthread_create();    //Linux下线程的创建
#endif

对于头文件,也使用同样的预编译宏来实现。如:

#ifndef _WINDOWS_#include <windows.h>
#else#include <thread.h>
#endif

这样就可以实现代码的可移植了。在编译的时候只要通过#define就可以选择在那个平台下完成程序的编译。

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

三、系统开销

使用系统调用会影响系统的性能,在执行调用时的从用户态切换到内核态,再返回用户态会有系统开销。

为了减少开销,因此需要减少系统调用的次数,并且让每次系统调用尽可能的完成多的任务

硬件也会限制对底层系统调用一次所能写的数据块的大小。

为了给设备和文件提供更高层的接口,Linux系统提供了一系列的标准函数库。

使用标准库函数,可以高效的写任意长度的数据块,库函数在数据满足数据块长度要求时安排执行底层系统调用。

一般地,操作系统为了考虑实现的难度和管理的方便,它只提供一少部分的系统调用,这些系统调用一般都是由C和汇编混合编写实现的,其接口用C来定义,而具体的实现则是汇编,这样的好处就是执行效率高,而且,极大的方便了上层调用。

随着系统提供的这些库函数把系统调用进行封装或者组合,可以实现更多的功能,这样的库函数能够实现一些对内核来说比较复杂的操作。

比如,read()函数根据参数,直接就能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员是不必关心的,这些操作里面自然也包含了系统调用。

而对于第三方的库,它其实和系统库一样,只是它直接利用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能(API的接口是开放的)。

 四、POSIX

POSIX可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),

1、定义

发布者为电气与电子工程师协会(Institute of Electrical and Electronics Engineers),简称IEEE。POSIX是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。POSIX.1 已经被国际标准化组织(International Standards Organization,ISO)所接受,被命名为 ISO/IEC 9945-1:1990 标准。

2、历史

POSIX是Unix的标准。

1974年,贝尔实验室正式对外发布Unix。因为涉及到反垄断等各种原因,加上早期的Unix不够完善,于是贝尔实验室以慷慨的条件向学校提供源代码,所以Unix在大专院校里获得了很多支持并得以持续发展。

于是出现了好些独立开发的与Unix基本兼容但又不完全兼容的OS,通称Unix-like OS。

包括:

  1. 美国加州大学伯克利分校的Unix4.xBSD(Berkeley Software Distribution)。
  2. 贝尔实验室发布的自己的版本,称为System V Unix。
  3. 其他厂商的版本,比如Sun Microsystems的Solaris系统,则是从这些原始的BSD和System V版本中衍生而来。

为了提高兼容性和应用程序的可移植性,阻止这种趋势, IEEE(电气和电子工程师协会)开始努力标准化Unix的开发,后来由 Richard Stallman命名为“Posix”。

这套标准涵盖了很多方面,比如Unix系统调用的C语言接口、shell程序和工具、线程及网络编程。

3、谁来遵循

首先就是大名鼎鼎的Unix和Linux了,除此之外还有苹果的操作系统也是Unix-based的。有了这个规范,你就可以调用通用的API了,Linux提供的POSIX系统调用在Unix上也能执行,因此学习Linux的底层接口最好就是理解POSIX标准。

转载自:posix是什么都不知道,还好意思说你懂Linux? - 知乎

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

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

相关文章

144显示器只有60_你知道显示器60Hz和144Hz的刷新率差别有多大吗?你没有用过吗?...

不知什么时候开始&#xff0c;高刷新率成为了显示器的一个重要卖点&#xff0c;成为了电竞游戏显示器的标配&#xff0c;越来越多的人在购买显示器时&#xff0c;开始抛弃早已定格60Hz刷新率&#xff0c;逐渐向120Hz刷/144Hz刷乃至更高的刷新率上靠拢。那么显示器60Hz和144Hz刷…

linux用户权限不够解析及解决方案

目录 一、用户账户&#xff1a;普通账户、超级账户&#xff08;root&#xff09; 二、组账户&#xff1a;私有组、标准组 三、linux下账户配置文件&#xff1a;passwd、shadow、group、gshadow。 四、文件权限 1、权限分类 2、文件权限含义 3、目录权限含义 四、权限不够…

chmod -R 644 dir04 报错:权限不够

错误截图 错误分析 1、分析当前用户有无对dir04的操作权限 有&#xff0c;dir04的所有者为wlh&#xff0c;wlh的权限为rwx。 2、分析-R是否可以使用空文件夹和文件&#xff0c;而非空文件夹不可以 可能是这样&#xff0c;但是尝试chmod -R 777 dir04成功。所以与非空无关&am…

云桌面部署_东胜区检察院检察工作网统一业务系统2.0云桌面终端全面部署完成...

按照最高检顶层设计和自治区院、市院关于做好统一业务系统2.0版试点应用工作的相关要求&#xff0c;东胜区人民检察院党组高度重视&#xff0c;高标准、高效率、高质量开展部署准备工作&#xff0c;着力保障统一业务应用2.0系统上线后稳、准、快的运行。为按时按要求完成任务&a…

python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...

http_request2.py用于发起http请求 #读取多条测试用例 #1、导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数 COOKIENon…

linux递归参数-R(r)和-p的区别

在linux系统中创建、复制、删除目录或文件时&#xff0c;常常会用到递归参数。常用的递归参数有-p,-r,-P等。为方便初学者学习、分辨与记忆&#xff0c;将其分类整理如下。 一般常用到递归的命令有&#xff1a;mkdir、cp、rm、ls、grep、chmod、chown等。 而mv命令没有递归参…

html table设置行高_字号与行高

1. 什么是字号与行高什么是字号大小&#xff1f;字号大小就是字体的高度&#xff0c;例如设置字号为50px&#xff0c;那么它的高度如下图所示&#xff1a;什么是行距呢&#xff1f;如下图所示&#xff1a;其中半行距 (lineHeight – fontSize) / 2。但是实际上&#xff0c;fon…

linux 用户名为没有名字 报错:cannot find name for user ID

经过一系列用户权限更改后&#xff0c;切换到普通用户&#xff0c;失败&#xff0c;报错如下&#xff1a; 解决方案&#xff1a;这个问题是因为普通用户没有权限读取/etc/passwd和/etc/group文件造成&#xff0c;添加权限即可。 转载自&#xff1a;id: cannot find name for us…

xposed hook 静态函数_浅谈 Xposed 新概念【模块作用域】

众所周知&#xff0c;Xposed 是一个系统级别的软件框架&#xff0c;它与 Cydia Substrate 不同&#xff0c;Xposed 仅可 hook app_process 中的 java 函数&#xff0c;不过对于大部分的 Android 应用来说已经足够了&#xff1b;它所提供的 API 可以供模块开发者在不修改目标应用…

adc0808温度换算公式_温湿度传感器的三种模拟量换算关系

气候的变化常常会导致空气当中的湿度以及温度随之而产生相应的变化&#xff0c;如果想及时感知空气中温湿度的变化&#xff0c;那就需要温湿度传感器。在日常生活中&#xff0c;温湿度传感器种类有很多&#xff0c;按照数据上传方式分有RS485型温湿度传感器、模拟量型温湿度传感…

共阳数码管段码表_简单共阴极数码管电路图大全

共阴极则是把所有LED的阴极连接到共同接点com&#xff0c;而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点)&#xff0c;如下图所示。图中的8个LED分别与上面那个图中的A~DP各段相对应&#xff0c;通过控制各个LED的亮灭来显示数字。判断公阴极和公阳极找公共共阴和公共共…

linux find 报错路径必须在表达式之前

执行 find -name yum*,查看当前文件夹下以yum开头的文件。 报错路径必须在表达式之前&#xff0c;如下图所示&#xff1a; 解决方案&#xff1a; 会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种 使用转义符把*转义&#xff0c;即 yum\*用引号引起来 &am…

css 动态生成圆形区域内扇形个数_CSS实用技巧总结

❝作者&#xff1a;幻灵尔依 (授权原创)https://juejin.im/post/5e0fef935188253a624a6a72❞《css揭秘》中讲了47个css技巧&#xff0c;其中有很多日常编码中并不会用到&#xff0c;本文除了将书中部分实用技巧罗列出来之外&#xff0c;还尝试用帮助读者搞明白background、anim…

python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

原标题&#xff1a;一行Python代码能做出哪些神器的事情 &#xff08;1&#xff09;一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http.server 8080 # python3 &#xff08;2&#xff09;一行代码实现变量值互换a, b 1, 2; a, b b, a &…

c++ string 字符_C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握

简介:C标准库提供的类型&#xff1a;string。长度可变的字符串&#xff0c;操作简单仅为包含个人常用函数头文件string 类型与其它的标准库类型相同&#xff0c;都需要包含对应的头文件string 类型的定义和初始化string 类型的函数&#xff08;1&#xff09;字符串的赋值输入及…

为什么机油使用后变红_水泥固化剂的使用原理是什么,涂洒后时间为什么要足够长?...

水泥固化剂由于具有提高水磨地面的强度、硬度、使地面不起灰&#xff0c;抗压强度、抗腐蚀的能力&#xff0c;广泛应用于现代工厂、仓储、停车场、商场、超市的装饰材料。那么&#xff0c;水泥固化剂涂洒后时间为什么足够长呢&#xff1f;下面听听好牛环境科技的小编的意见吧&a…

CentOS虚拟机访问外部网络

这里写自定义目录标题虚拟机无网络测试解决方案1、设置VM&#xff08;关闭虚拟机&#xff09;2、查看当前IP、网关、子网掩码3、设置虚拟机IP、网卡、子网掩码虚拟机无网络测试 CentOS使用yum下载gcc时报错&#xff1a;cannot find a valid baseurl for repo:base/7/x86_64,百…

4x4矩阵键盘工作原理及扫描程序_基于复杂可编程逻辑器件实现键盘接口电路的设计...

1 引言无功补偿装置是用于补偿电网无功功率的不足&#xff0c;提高功率因数&#xff0c;保证供电系统安全运行和节约电能的设备&#xff0c;其核心是控制仪。本控制仪集无功补偿、电度量计量、电能质量监测及通信于一体&#xff0c;对电网参数进行实时采样与计算并把各项参数显…

python opencv轮廓检测_OpenCV 轮廓检测的实现方法

轮廓概述 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 为了更加准确&#xff0c;要使用二值化图像。在寻找轮廓之前&#xff0c;要进行阈值化处理或者 Canny…

4.3 媒资管理模块 - Minio系统上传图片与视频

文章目录 一、上传图片1.1 需求分析1.2 数据模型1.2.1 media_files 媒资信息表 1.3 准备Minio环境1.3.1 桶环境1.3.2 连接Minio参数1.3.3 Minio配置类 1.4 接口定义1.4.1 上传图片接口请求参数1.4.2 上传图片接口返回值1.4.3 接口代码 1.5 MediaFilesMapper1.6 MediaFileServic…