【问题标题】:What POSIX system interfaces depend on /bin/sh?哪些 POSIX 系统接口依赖于 /bin/sh?
【发布时间】:2016-04-05 21:05:11
【问题描述】:

POSIX 系统接口

两者都使用/bin/sh 来执行外部程序。是否有任何其他 POSIX 函数,如果我在我的应用程序中使用它们,会引入对 /bin/sh 的依赖?

【问题讨论】:

  • popen 不是标准的 C 函数。
  • 低级函数,如打开关闭读写使用 Un*x 内核提供的例程,但 C 可执行文件在 DOS 和 Windows™ 上完美运行,因此它们也提供这些例程。
  • @nwellnhof 他没有说标准C。问题被标记为Unix。
  • HERE 是一个似乎支持 Barmer 评论的参考。

标签: c unix posix sh


【解决方案1】:

该列表至少包括:

  • popen()

  • system()

  • execlp()execvp()

    在 exec 系列函数的其他成员失败并将 errno 设置为 [ENOEXEC] 的情况下,execlp()execvp() 函数应执行命令解释器,执行命令的环境应为如果进程调用了sh 实用程序

  • wordexp()(可能)

    虽然wordexp() 可以完全作为库例程实现,但预计大多数实现会在子进程中运行 shell 来进行扩展。

引用来自POSIX

【讨论】:

  • 如果新的进程映像文件不是可执行文件,posix_spawn() 似乎也使用/bin/sh
  • @rphv:这是可能的,但在 Posix 和 Linux 或 FreeBSD 的手册页中都没有提到。你试过这个实验吗?如果是这样,在什么系统上? (使用 /bin/sh 与解释 shebang 行不同。shebang 可以在没有 shell 的情况下处理,因为它不进行参数解析。)
  • 我通过 grepping glibc 存储库得出了这个结论。在 sysdeps/posix/spawni.c 中有以下注释以及使用路径 /bin/sh__execve 的调用:“该文件可访问,但它不是可执行文件。调用 shell 将其解释为脚本。 "
  • @rphv:如果您仔细查看 glibc,您会发现您发现的代码仅在 glibc 2.2 到 2.15 版本的兼容模式下执行。在 2011 年 9 月 5 日的变更日志中有一条注释引用了bug #13134
  • 我同意你的评价。感谢您的观看。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多