【问题标题】:What are the most important POSIX functions not available in Android?Android 中没有哪些最重要的 POSIX 功能?
【发布时间】:2012-08-20 03:36:12
【问题描述】:

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

现在我的实际问题是:

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

我试图在 Google 上找到一些东西,但没有发现任何真正有用的东西,只是到处都有一些东西提到 Android 上有一些 POSIX 功能......

【问题讨论】:

标签: android c++ linux android-ndk posix


【解决方案1】:

仿生由 Google 重新编码。它很小,但针对 Android 进行了优化。

据我所知,它唯一缺少的就是pthread_cancel() 函数。

我的经验是,如果你成功地将它移植到 GNU/Linux,没有pthread_cancel() 调用,那么你应该没问题。

顺便说一句,您要构建什么样的库?它有什么用途?网络、线程...

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

【讨论】:

    【解决方案2】:

    仿生维基百科页面

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

    还有一些有趣的信息:

    尽管仿生旨在实现所有 C11 和 POSIX,但(截至 Oreo)libc 中仍然缺少大约 70 个 POSIX 函数[8]。还有一些 POSIX 函数,例如 endpwent/getpwent/setpwent 系列不适用于 Android,因为它缺少 passwd 数据库。截至 Oreo,libm 已完成。

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

    树文档中的官方仿生引用

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

    在 bionic/ 中运行 ./libc/tools/check-symbols-glibc.py 以获取由 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 函数。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      共享内存也是您可能会发现在 android 中以不同方式实现的东西。尝试在 android 内核上使用 shm_open 和 shm_unlink 时受到重创。 Android 实现异步共享内存(ashmem)。

      【讨论】:

      • 是的,必须调用 ashmem_create_region 并通过活页夹在进程之间共享返回的文件描述符以映射它。
      猜你喜欢
      • 2022-10-25
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多