哪些是安卓系统中不可用的最重要的POSIX功能

What are the most important POSIX functions not available in Android?

本文关键字:最重要的 功能 POSIX 系统      更新时间:2023-10-16

我即将把一个大型C++项目(某种库项目,它完全不包含GUI)移植到Android。它实际上是一个Visual C++项目,但它将作为中间步骤移植到Linux。我知道Android不是一个"完整的"Linux,也没有声称提供所有的POSIX功能,但我也知道使用NDK在Android上有很多"POSIXish功能"。

现在我的实际问题是:

与完整的POSIX相比,哪些是Android上不可用的最大/最重要的功能?因此,在进行从Visual C++到Linux GCC的移植时,我可以记住这一点。

我试着在谷歌上找到一些东西,但没有发现任何真正有用的东西,只是偶尔有一些东西提到安卓上有一些POSIX功能。。。

Bionic被谷歌重新编码。它很小,但针对Android进行了优化。

据我所知,它真正缺少的一件大事就是pthread_cancel()函数。

我的经验是,如果你成功地将它移植到GNU/Linux,而没有pthread_cancel()调用,那么你应该基本上没事

顺便说一句,你想建一个什么样的图书馆?它用什么?网络,线程。。。

PS:即使是Linux也不是完全的POSIX。

仿生维基百科页面

https://en.wikipedia.org/wiki/Bionic_(软件)#Differences_from_POSIX

还有一些有趣的信息:

尽管bionic的目标是实现所有C11和POSIX,但(截至奥利奥)libc中仍然缺少大约70个POSIX函数[8]。还有一些POSIX函数,如endgwent/getpwent/setpwent家族,由于缺乏密码数据库,因此不适用于Android。截至奥利奥,libm已完成。

出于安全原因,有些函数故意不符合POSIX或C标准,例如printf,它不支持%n格式字符串。[9]

官方仿生树文档报价

https://android.googlesource.com/platform/bionic/+/37ad9597839c70a7ec79578e5072df9c189fc830/docs/status.md

跑步/libc/tools/check-symbols-glibc.py在bionic/中,用于glibc而非bionic实现的POSIX函数的当前列表。目前(2017-10):

aio_cancel
aio_error
aio_fsync
aio_read
aio_return
aio_suspend
aio_write
lio_listio
pthread_cancel
pthread_mutex_consistent
pthread_mutex_getprioceiling
pthread_mutex_setprioceiling
pthread_mutexattr_getprioceiling
pthread_mutexattr_getprotocol
pthread_mutexattr_getrobust
pthread_mutexattr_setprioceiling
pthread_mutexattr_setprotocol
pthread_mutexattr_setrobust
pthread_setcancelstate
pthread_setcanceltype
pthread_testcancel
wordexp
wordfree
libm

当前libm符号:https://android.googlesource.com/platform/bionic/+/master/libm/libm.map.txt

剩余0个缺少POSIX libm函数。

缺少的最明显的功能是pthread_cancel()

此博客包含一些其他详细信息:http://codingrelic.geekhold.com/2008/11/six-million-dollar-libc.html

Bionic的良好概述:https://android-platform.googlegroups.com/attach/0f8eba5ecb95c6f4/OVERVIEW.TXT?gda=HWJaO0UAAAB1RXoVyyH5sRXFfLYnAq48KOFqr-45Jqvtfia6gxIj4Qe8cBqW3BaWdSUPWi_jHqO3f1cykW9hbJ1ju6H3kglGu1iLHeqhw4ZZRj3RjJ_-A&视图=1&part=4

共享内存在android中也有不同的实现方式。在尝试在android内核上使用shm_open和shm_onlink时受到了沉重打击。Android实现了异步共享内存(ashmem)。