AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 538844
Accepted
PSkocik
PSkocik
Asked: 2019-09-04 04:04:03 +0800 CST2019-09-04 04:04:03 +0800 CST 2019-09-04 04:04:03 +0800 CST

POSIX 是否保证任何标准实用程序的路径?

  • 772

从 C 语言中,运行标准实用程序(例如 ps)最简单的方法是什么?

例如,POSIX 是否保证有一个标准ps,/bin/ps或者我应该将 PATH 环境变量重置为我得到的confstr(_CS_PATH, pathbuf, n);,然后通过 PATH-search 运行该实用程序?

c path
  • 2 2 个回答
  • 3416 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2019-09-04T05:49:05+08:002019-09-04T05:49:05+08:00

    不,它不需要,主要是因为它不要求系统默认符合,或者只符合POSIX 标准(排除任何其他标准)。

    例如,Solaris(一个经过认证的兼容系统)为其实用程序选择了向后兼容性/bin,这解释了为什么它们以神秘的方式运行,并在不同的位置提供符合 POSIX 的实用程序(/usr/xpg4/bin,/usr/xpg6/bin...对于不同版本的 XPG(现已合并POSIX)标准,这些实际上是 Solaris 中可选组件的一部分)。

    甚至sh不能保证在/bin。在 Solaris 上,在/bin/shSolaris 10 之前曾经是 Bourne shell(因此不兼容 POSIX),而现在在 Solaris 11 中是 ksh93(仍然不完全兼容 POSIX,但实际上比/usr/xpg4/bin/sh.

    从 C 中,您可以使用exec*p()并假设您处于 POSIX 环境中(特别是关于PATH环境变量)。

    您还可以设置PATH环境变量

    #define _POSIX_C_SOURCE=200809L /* before any #include */
    ...
    confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
                                          * PATH if need be */
    setenv("PATH", buf, 1);
    exec*p("ps"...);
    

    或者,您可以在构建时确定要运行的 POSIX 实用程序的路径(请记住,在 GNU 等某些系统上,您需要更多步骤,例如设置POSIXLY_CORRECT变量以确保合规性)。

    您还可以尝试以下操作:

    execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                             "unset IFS;shift \"$1\";"
                             "exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
    

    希望有一个shin $PATH,它类似于 Bourne,还有一个getconf,并且它是您感兴趣的 POSIX 版本的那个。

    • 35
  2. Geoff Nixon
    2019-09-05T06:04:57+08:002019-09-05T06:04:57+08:00

    实际上,我基本上会回答yes。POSIX 确实保证:

    1. 每个指定实用程序的标准兼容版本都有一个绝对路径,
    2. 并且,您必须能够找到此绝对路径,并能够执行此实用程序。

    尽管不一定保证每个实用程序都应位于所有系统的特定目录中 ( /bin/ps),但始终保证能够在系统默认 PATH 中以可执行文件的形式找到它。

    实际上,在标准中执行此操作的唯一标准指定方法是(在 C 中)通过unistd.h_CS_PATH 或在 shell 中,通过command和getconf实用程序的组合,即必须始终返回符合POSIXPATH="$(command -p getconf PATH)" command -v ps的唯一绝对路径在特定系统上提供。也就是说,虽然系统默认 PATH 变量中包含哪些路径是由实现定义的,但这些实用程序必须始终在其中指定的路径之一中可用、唯一且兼容。ps

    请参阅:< unistd.h >,命令。

    • 4

相关问题

  • 堆什么时候用于动态内存分配?

  • GNU make dep 究竟做了什么?

  • 如何将命令应用于带有空格的 $PATH 文件?

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 基于 OpenCV 的程序优化嵌入式 linux OS [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve