qq空间做网站,无法分享到wordpress,旅行社手机网站建设,成品短视频app源码的下载方法1. 什么是 POSIX
参考链接–知乎 POSIX 标准包含了进程管理、文件管理、网络通信、线程和同步、信号处理等方面的功能。 这些接口定义了函数、数据类型和常量等#xff0c;为开发者提供了一个可移植的方法来与操作系统进行交互。 2. 谁遵守这个标准
遵守 POSIX 标准的主要是…1. 什么是 POSIX
参考链接–知乎 POSIX 标准包含了进程管理、文件管理、网络通信、线程和同步、信号处理等方面的功能。 这些接口定义了函数、数据类型和常量等为开发者提供了一个可移植的方法来与操作系统进行交互。 2. 谁遵守这个标准
遵守 POSIX 标准的主要是 C 实现相关的程序如操作系统或 C 标准库函数。
2.1 操作系统 操作系统利用 POISX 定义一组通用的 API将底层操作系统的功能封装起来从而提供了与具体操作系统无关的高级功能。 即操作系统的 POSIX API 是面向底层硬件的。旨在让用户开发应用程序更方便与硬件交互。 Unix 和 Linux、苹果的Mac OS X、win10 等等都存在 POSIX 标准的系统调用函数。
利用 POSIX 函数开发程序示例 利用 linux 下 POSIX 标准的进程管理相关函数做了一个程序将该程序移植到另一个支持 POSIX 的系统上后如移植到 WIN10该程序可能不能正常运行分析原因实现了 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 就可以选择在那个平台下完成程序的编译。
综上所述我们都是将CC等各种语言当作中间层以实现其一定程度上的可移植。如今语言的跨平台的程序都是以这样的方式实现的。但是在不同的平台下仍需要重新编译。
3. 库函数 和 系统调用间关系图
以 printf() 函数调用为例 printf 函数执行过程中程序运行状态切换如下
用户态 – 系统调用 – 内核态 – 返回用户态实例代码如下
#include stdio.hint main(int argc, char **argv)
{printf(yikoulinux); return 0;
} 编译执行
rootubuntu:/home/peng/test# gcc 123.c -o run
rootubuntu:/home/peng/test# strace ./run注意运行程序前加上 strace可以追踪到函数库调用过程得到结果如下图 如执行结果可知 我们的程序虽然只有一个 printf 函数但是在执行过程中我们前后调用了 execve、access、open、fstat、mmap、brk、write 等系统调用。 其中 write 系统调用会把字符串yikoulinux 通过设备文件 1发送到驱动该设备节点对应终端 stdout。
4. 遵循 POSIX 标准的好处
最大好处就是可以开发出可移植性强的程序通常利用的是 C 语言标准库函数。