c++跨平台技术学习(三)--使用标准API

article/2025/7/27 22:52:46

Posix.1 API定义了大量的函数,在各方面的功能都很丰富,下面对其进行介绍

System V接口定义

它是一份描述了AT&T UNIX System V操作系统的文档,与POSIX.1保持一致,是它的一个超集。SVID由基础系统和扩展定义,它只定义了C编程接口,没有定义任何用户级别的命令,基础系统更进一步细分几个类别

基础OS服务程序

它由以下三个子类组成:

  • 第一组:包含了完整基础OS服务程序核心功能的函数,有150个左右。函数如mkdir、malloc、popen、sigaction、fopen等都可以在这里找到
  • 第二组:包含了以下低级的操作系统函数:close、creat、dlclose、dlerror、dlopen、dlsysm、execl、execle、execlp、execv、execve、execvp、fork、lseek、mount、open、read、readv、umount、write、和writev
  • 第三组:只有_exit和sync

数学函数

这个类别包含了将近40个函数支持各种数学操作,如abs、floor、ceil、sin、cos、tan、log、log10、pow和sqrt。

字符串和字符的处理

有超过150个函数,包括str族(strok、strncat等);ctype函数如toascii、tolower、isupper和isdigit,转换函数如asctime、atof、atol和atoi;多字节和宽字符函数如mblen、mbrtow、wscncpy、wcsstr和wcsncpy;以及men族函数,包括memchr、memcpy、memset和memmove

网络函数

大部分开发人员都知道Berkeley sockets API在网络应用中的角色,但是socket、bind、listen、accept、connect等函数并不属于SVID。取而代之的是XTI(X/Open Transport Interface)是由X/Open开发的TLI(Trasnport Layer Interface)的一个扩展。TLI则是由AT&T开发的一套API。在旧版本的mac OS上写过网络代码的mac os工程师或许会对这些函数比较熟悉,因为TLI和XTI曾经是OpenTransport网络API的基础。TLI/XTI的一个优点是传输无关的。

通用库函数

这个类别包含了100多个能在ISO标准C库里找到的函数,包括glob、drand48、nrand48、bsearch、catgets、gets、puts、fgets、fputs、getopt、printf、putchar、getc、sprintf、sscanf

XPG、X/Open和Single UNIX Specification

XPG是由X/Open开发的一系列标准,BSD(Berkeley Standard Distribution)包括sockets以及相关API。

在GCC里使用标准支持

编译器标志

第一个要在GCC中加的参数或许就是-ansi和-pendantic。-ansi参数令GCC严格遵守ANSI/ISO C语言标准,并且移除所有的GNU扩展。-pendantic参数则令GCC拒绝接受任何不符合标准的代码。省略这个参数不会禁止你在调用定义在C库里符合标准的函数,但是它能帮助你避免误用API,例如像库里(库里躺枪)的函数传递了错误类型的参数。

-Wall参数一定要在命令行的参数里,编写可移植代码第一步就是编写正确的代码

头文件

接下来就是要包含定义了调用函数的头文件,如果使用率-ansi和-pendantic标志的话,这就是必须的步骤。可以通过终端窗口或者Google来查看man(1)page确定应该包含哪些头文件,通常在Synopsis一节中找到

ATOF(3) System Library Fuctions Manual ATOF(3)NAMEatof -convert ASSII string to double
LIBRARY
Standard C Library(libc,-lc)
SYNOPSIS
#inclue<stdlib.h>
double
atof(const char * nptr)

所以要使用atof()函数,就需要以如下的方式包含

#include<stdlib.h>

在C++里也ok,但是C++推荐的用法是只包含文件名而去除后缀.h.如下

#include<cstlib>

GCC提供的头文件不需要包含多次,而且包含顺序也么有影响。

命令行参数-ansi令只接受ISO/ANSI的特性。若要使用POSIX或SVID支持的接口,你需要打开一些GCC定义的宏才行,这些宏应该在每个源文件的开头指定任何头文件之前定义。这样宏就能被C预处理器正确处理,进而影响到GNU提供的头文件里哪些函数、常量、宏的声明和定义可以在你的代码里出现。还可以在Makefile里用-D命令行选项来定义这些宏,不过GNU文档推荐的方式是直接在源文件里包含它们。

下面的代码来自

typedef void *DIR#define _POSIX_SOURCE 1 … #include<dirent.h>

那么下列语句就回定义DIR类型

不然DIR就会在#else语句里定义:

#include<sys/dirent.h>
#ifdef _POSIX_SOURCE
typedef void *DIR;
#else
#define d_ino d_fileno
#define DIRBLKSIZ 1024
typedef struct _dirdesc {int dd_fd;long dd_loc;long dd_size;char * dd_buf;int dd_len;long dd_seek;long dd_rewind;int dd_flags;}DIR;
#define drifd(dirp)((dirp)->dd_fd)
#define DIF_HIDEW 0x0001
#define DTF_NODUP 0x0002
#define DTF_REWIND 0x0004
#define _DTF_READALL Ox0008
#ifndef NULL
#define NULL 0
#endif
#endif

这是和之前讨论的标准相关的GCC所支持的宏的列表

  • _POSIX_SOURCE:定义它会打开POSIX.1标准和所有ISO C的工具。如果把_POSIX_SOURCE定义成为一个正整数,那么可以将其忽略

  • _POSIX_C_SOURCE:把它定义为一个大于1的整数,符合1990年POSIX标准;定义为2符合POSIX.2标准,定义为大于199309L的整数,包含所有1993年POSIX.1b标准的功能

  • _BSD_SOURCE:被定义后,允许访问4.3 BSD UNIX、ISO C、POSIX.1和POSIX.2的功能。定义这个宏后,当4.3BSD定义和POSIX发生冲突1时,会优先采用4.3BSD的定义。必须在链接应用程序是使用-lbsd-compat参数在普通C函数库里搜索他们之前解决BSD函数的问题

  • _SVID_SOURCE:定义它可以包含SVID系列的功能以及由ISO C、POSIX和X/Open标准提供的功能

  • _XOPEN_SOURCE:打开X/Open Portability Guide定义的功能,以及包含由_POSIX_SOURCE和_POSIX_C_SOURCE宏定义的函数。值为500时,还包含Single UNIX Specification第2版里的新功能

  • _ISOC99_SOURCE:C99标准

  • _GNU_SOURCE:包括之前所有的内容。如果有任何POSIX.1与BSD发生冲突的内容,POSIX的定义将会优先于BSD。由于GNU扩展是不可移植的,所以应该避免使用这个宏

微软Runtime Library对POSIX的支持

创建文件的API展示了Win2、POSIX和Windows NT系统如何协同工作的。在Win32下,创建文件的函数是CreateFile,在POSIX API里则是creat()函数。这两个函数功能一模一样,把接受的参数按需要处理后,再传给Windows NT的NtCreateFile()函数

NtCreateFile(OUT PHANDLE             FileHandle,IN ACCESS_MASK          DesiredAccess,IN POBJECT_ATTRIBUTES   ObjectAttributes,OUT PIO_STATUS_BLOCK    IoStatusBlock,IN PLARGE_INTEGER       AllocationSize OPTIONAL,IN ULONG                FileAttributes,IN ULONG                ShareAccess,IN ULONG                CreateDisposition,IN ULONG                CreateOptions,IN PVOID                EaBuffer OPTIONAL,IN ULONG                EaLength );

不过上面代码有点系小问题。POSIX的creat()并不存在与微软的运行库中,而是以_creat()形式出现的。在微软RTL里的POSIX函数都是这种命名规则,_dup()、_fdopen()等。这么做的意思是如果不使用一些宏和封装来吧一个版本里的函数映射到另一个版本上的话,这些函数都是不可移植的。

微软RTL的文档为open函数添加了O_BINARY、O_TEXT和其他一些没有在POSIX定义的标志位,它还不支持O_SHILOCK和O_EXLOCK。

还有一些为Mac OS X和Linux编写的POSIX代码无须修改就可以移植到Windows上的。最好还是尽量用通用的部分编写代码,并且充分测试保证运行的兼容性


http://chatgpt.dhexx.cn/article/Q0vmiLdy.shtml

相关文章

BUUCTF刷题记录 Ping Ping Ping

[GXYCTF2019]Ping Ping Ping 进入页面 然后/?ip127.0.0.1|ls 进入 读取flag.php 再cat$IFS$1indnx.php 再变量拼接 ?ip127.0.0.1;ag;cat$IFS 1 f l a 1fla 1flaa.php 转至 http://1d22a0a5-c6a0-43f1-8e52-e5a33ec7e044.node3.buuoj.cn/?ip127.0.0.1;ag;cat$IFS 1 f l a …

JVM 答疑解惑

JVM是什么&#xff1f; 平常接触的东西都存在哪里&#xff1f; 类如何加载&#xff1f; 怎么运行&#xff1f; 清洁工怎么工作&#xff1f; JVM是什么&#xff1f; Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目…

2021-CISCN西南赛区线下-misc-stealer

stealer 题目描述&#xff1a; stealer 那女孩对我说说我是一个小偷&#xff08;本题flag 格式为 DASCTF{}&#xff0c;提交时只需要提交括号中间的字符。flag需小写&#xff09; hint&#xff1a;MISC-stealer: focus on DNS CRYPTO 知识点 1.DNS后面的base64 2.然后base6…

CVPR 2019|PoolNet:基于池化技术的显著性检测 论文解读

作者 | 文永亮 研究方向 | 目标检测、GAN 研究动机 ​ 这是一篇发表于CVPR2019的关于显著性目标检测的paper&#xff0c;在U型结构的特征网络中&#xff0c;高层富含语义特征捕获的位置信息在自底向上的传播过程中可能会逐渐被稀释&#xff0c;另外卷积神经网络的感受野大小与深…

请问做亚马逊,注册P卡是用个人名义还是公司名义?

请问做亚马逊&#xff0c;注册P卡是用个人名义还是公司名义&#xff1f;亚马逊将Payoneer作为亚马逊卖家平台里的推荐收款方式。24个不同国家的卖家能够使用亚马逊卖家中心唯一推荐的收款方式——Payoneer来收款&#xff0c;接收、使用亚马逊货款变得前所未有地简便。 个人、公…

解决CentOS7 Ping不了外网的问题 ping:baidu.com: 未知的名称或服务

在CentOS7中遇到个问题&#xff0c;ping外网地址时候提示“未知的名称或服务” 先使用该命令查看路由网关信息 route -n 发现没有配置网关地址&#xff1a; ​​​​​​​ 去虚拟机里的虚拟网络编辑器里查看下网关地址 然后将网关地址配置到路由中 &#xff08;临时有效&…

BUUCTF Web [GXYCTF2019]Ping Ping Ping

「作者主页」&#xff1a;士别三日wyx 此文章已录入专栏《网络攻防》&#xff0c;持续更新热门靶场的通关教程 「未知攻&#xff0c;焉知收」&#xff0c;在一个个孤独的夜晚&#xff0c;你完成了几百个攻防实验&#xff0c;回过头来才发现&#xff0c;已经击败了百分之九十九…

[GXYCTF 2019]Ping Ping Ping

前言 之前没总结过关于命令执行的绕过姿势&#xff0c;借着今天做的这个命令执行的题目来总结一下。 先看题目 题目 题目很单一&#xff0c;目的就是为了让我们通过参数传入内容来执行代码。因为题目是与ping有关&#xff0c;当我们输入127.0.0.1时&#xff0c;它会进行ping…

[GXYCTF2019]Ping Ping Ping(命令执行)

命令执行绕过 常见写法 127.0.0.1&&code 只有在 && 左边的命令返回真&#xff08;命令返回值 $? 0&#xff09;&#xff0c;&& 右边的命令才 会被执行。 127.0.0.1&code &表示将任务置于后台执行 127.0.0.1||code 只有在 || 左边的命令返回…

CTF_Web_[GXYCTF2019]Ping Ping Ping

一、题目 Ping Ping Ping 二、靶机信息链接 靶机信息 剩余时间: 10072s http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81 三、靶机链接页面 四、 分析 因题目是Ping...再加上靶机页面有“/?ip” 可能是 ping地址&#xff0c;尝试按照所给的内容在url中加…

BUUCTF [GXYCTF2019]Ping Ping Ping easywill

题目地址&#xff1a;BUUCTF在线评测 考点&#xff1a;ping命令相关命令执行 这里过滤了flag和空格 绕过空格可以使用 $IFS$1 使用ls命令查询目录 ?ip127.0.0.1;ls 发现有两个文件&#xff0c;一个是flag.php&#xff0c;另一个是index.php。 cat获取文件内容&#xff…

BUUctf [GXYCTF2019]Ping Ping Ping

根据题目和页面的提示猜测是命令执行漏洞 ;前面和后面命令都要执行&#xff0c;无论前面真假 |直接执行后面的语句 ||如果前面命令是错的那么就执行后面的语句&#xff0c;否则只执行前面的语句 &前面和后面命令都要执行&#xff0c;无论前面真假 &&如果前面为假&a…

BUUCTF——web([GXYCTF2019]Ping Ping Ping、[极客大挑战 2019]Knife、[极客大挑战 2019]Http)

BUUCTF-web [GXYCTF2019]Ping Ping Ping做题思路 [极客大挑战 2019]Knife做题思路 [极客大挑战 2019]Http做题思路 [GXYCTF2019]Ping Ping Ping 做题思路 打开看题目 熟悉的样子&#xff0c;ping本地加查看命令&#xff0c;得到两个php文件 接着查看一下文件内容 奇奇怪…

Buuctf (Web)Ping Ping Ping

文章目录 一.解题步骤二、命令分隔符三.常见绕过方式 一.解题步骤 &#xff08;1&#xff09;页面里显示/?ip,很明显要以ping的形式传一个参数给ip&#xff0c;并且我们要想执行其他命令&#xff0c;就要用命令分隔符也就是管道符连接&#xff0c;命令分隔符可以用";“”…

BUUCTF之Ping Ping Ping

目录 审题 常用的空格绕过方法 解决方法 法一 拼接绕过法 法二 内联执行法 法三 sh编码绕过法 审题 点开链接 根据题目提示随便试试构造payload inurl?ip666 有返回&#xff0c;参数ip的值就是要ping的内容 这里我们知道有Windows和Linux通用的…

BUUCTF【Web】Ping Ping Ping

进入靶场后是一个ping的功能&#xff08;命令执行漏洞&#xff09;&#xff0c;参数ip传递的内容会被当做ip地址进行网络连通性测试。首先测试一下本机地址 首先使用ls命令查看当前路径下有那些文件&#xff0c;拼接符有“&”、“|”、“||”、“&&”、“&#xff…

BUUCTF Web [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http

目录 [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http [GXYCTF2019]Ping Ping Ping 启动靶机&#xff0c;构造payload ?ip127.0.0.1 查看同目录下有什么文件 ?ip127.0.0.1;ls 读取flag.php ?ip127.0.0.1;cat flag…

buuctf[GXYCTF2019]Ping Ping Ping

buuctf[GXYCTF2019]Ping Ping Ping 这个题目的标题是pingping盲猜是关于命令执行的题目 打开环境后 只有一个/ip&#xff1f; 应该是提示用get的方式来传参一个地址执行ping的操作 直接ping127.0.0.1 回显ping127.0.0.1的数据 说明是一道命令执行的题目 执行&#xff1a;?i…

xxl-job源码阅读——(六)调度线程与时间轮算法

文章目录 一. 时间对齐二. scheduleThread 调度线程三. ringThread 时间轮&#xff08;算法&#xff09;线程原理源码实现 本章介绍init()最后一个步骤&#xff0c;初始化调度线程。 另外 第六步的JobLogReportHelper.getInstance().start()只是做了一个日志整理收集&#xff0…

时间轮(七)

时间轮 Kafka 中存在大量的延时操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka 并没有使用 JDK 自带的 Timer 或 DelayQueue 来实现延时的功能&#xff0c;而是基于时间轮的概念自定义实现了一个用于延时功能的定时器&#xff08;SystemTimer&#xff09;。JDK 中…