在静态初始化程序中(即在 main() 之前)使用 getenv() 是否安全?

2024-01-04

我看了进去,并且在Posix 程序员指南 https://rads.stackoverflow.com/amzn/click/com/0937175730,我能找到的最好的是

称为的字符串数组环境当该过程开始时可用。 该数组由外部变量指向environ,定义为:

extern char **environ;

就是那个environ让我犹豫的变量。我想说

- 调用进程/shell 已经分配了以 null 结尾的字符串块

-“外部”变量environ被用作入口点getenv().

-本身欢迎致电getenv()在静态初始值设定项内。

但我找不到任何保证“静态初始化”environ位于所有其他静态初始化代码之前。我是不是想太多了?

Update

On my平台(AMD Opteron、Redhat 4、GCC 3.2.3)、设置LD_DEBUG表明environ已设置before我的静态初始化程序被调用。这是一件很高兴知道的事情;谢谢,@codelogic。但这不一定是我在所有平台上得到的结果。

另外,虽然我在 C/C++ 运行时库的行为上直观地同意@ChrisW,但这只是我基于经验的直觉。因此,任何可以引用权威人士的言论的人都可以保证environ在调用静态初始化器之前是否存在,加分!


我认为你可以设置 LD_DEBUG 来运行你的程序来查看确切的顺序:

LD_DEBUG=all <myprogram>

EDIT:如果您查看运行时链接器(glibc 2.7)的源代码,特别是在文件中:

  • sysdeps/unix/sysv/linux/init-first.c
  • sysdeps/i386/init-first.c
  • csu/libc-start.c
  • sysdeps/i386/elf/start.S

您将看到 argc、argv 和 environ(别名为__environ)在调用任何全局构造函数(init 函数)之前设置。您可以从实际入口点 (start.S) _start 开始执行。正如你引用史蒂文斯的话“当进程开始时,称为环境的字符串数组可用”,表明环境分配发生在进程初始化的一开始。这由链接器代码支持,其作用相同,应该让您足够安心:-)

EDIT 2:另外值得一提的是,environ 设置得足够早,甚至运行时链接器也可以查询它以确定是否详细输出(LD_DEBUG)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在静态初始化程序中(即在 main() 之前)使用 getenv() 是否安全? 的相关文章

  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged

随机推荐

  • 使用 BOOST_FUSION_ADAPT_ADT 增强类的融合序列化

    我正在尝试使用 boost fusion 为类获取序列化模块 我已将我的类转换为 boost fusion 序列 此示例取自 Michael Caisse 在 boostcon 13 上演讲的幻灯片 https github com boo
  • MVC 在呈现给用户之前更改响应的最后机会

    我需要在呈现给用户之前更改完整的 html 响应流 使用 html 解析 最后一次机会在哪里 什么时候 恕我直言 在 ASP NET MVC 环境中更改 HTML 响应的更好方法是使用操作过滤器 这是用于压缩输出的动作过滤器的示例 publ
  • 使用 eclipse 从 xsd 生成无头 xml

    在最新版本的免费开源 Eclipse IDE 中 您可以从 DTD 和 XSD 文件生成 XML 文档 右键单击给定的 dtd 或 xsd 文件 然后选择 生成 gt XML 文件 您可以选择要生成哪个根元素以及是否应生成可选属性和元素 我
  • 为什么这不起作用 - Android - onCreate()

    下面的代码不起作用 并抛出NullPointerException引起的RuntimeException public class ListFilteredActivity extends Activity LinearLayout typ
  • 替换网页上链接的方括号

    我正在尝试使用 jQuery Javascript 解析 html 内容 我想查找方括号之间的单词并更改链接的整个单词 Example div This is text inside a div It has a reference to
  • SingleChildScrollView/Column 内的 ReorderableListView

    我需要将可重新排序列表放入 SingleChildScrollView 中 但 ReorderableListView 没有像 ListView 那样的收缩包装 是否有解决方法可以在不使用过时且无人维护的包的情况下完成此布局 虽然 我还没有
  • 在 WinForms 应用程序中显示 XML 文件,具有类似 IE 的着色和折叠节点

    我想在我的 NET 2 0 WinForms 应用程序中显示一个 XML 文件 就像 IE 一样 您可以折叠节点 并且所有内容的颜色都很漂亮 有内置的方法可以做到这一点吗 您可以在应用程序的表单中托管 IE 也可以使用 IE 使用的相同 X
  • 在 PHP 中执行 exec() 或 system() 且不等待输出

    我想从 PHP 脚本中触发 eider exec 或 system 中的 shell 命令 但这是一项需要一段时间才能完成的任务 有没有办法触发它并继续运行 PHP 页面加载而不延迟 编辑 我使用的是 CentOS 6 PHP 5 3 取决
  • 猫头鹰旋转木马无法按 RTL 方向工作

    Owl Carousel 滑块不适用于 RTL 我加rtl true在配置中 但它没有加载滑块 滑块空间在那里并且导航正在显示 但只有滑块内容没有显示 我该如何解决这个问题 我的代码如下 div class row div class it
  • 指定源目录时 Doxygen 找不到文件

    Hello 我尝试使用 doxygen 从一组文件夹生成代码文档 我的文件夹结构是这样的 root include include subdir file h src src subdir file cpp Documentation do
  • UNIX2DOS 功能

    bin ksh c cat PMSourceFileDir RT TgtFiles OutputFileStrPerfHdr PMSourceFileDir RT TgtFiles OutputFileStrPerfCSV unix2dos
  • 预处理器时间戳

    是否可以通过预处理器宏生成嵌入式 Unix 时间戳 例如 define VERSION EXPIRE TIMESTAMP 原因是 我有测试版 我想在编译时生成过期时间戳 在特殊的构建配置中 我已解决如下 define VERSION TIM
  • 为什么 returned() 不接受生成器?

    我正在努力写这样的东西 list reversed list el iterancestors 1 2 3 生成器很糟糕 因为我被迫将它们消耗到列表中 有没有办法简化这个 我认为reversed 应该接受迭代器 我错了吗 生成器不保证有最后
  • javascript 文件中的 Django {% static 'path' %}

    在我的 script js 中 pic src static photos 1 jpg This works pic2 src static photos 1 jpg Does not work 世界上为什么会发生这种事 由于在我的 hom
  • 如何在 C# 中转换纪元时间?

    如何转换 Unix纪元时间 http en wikipedia org wiki Unix time在 C 中变成实时 纪元开始于 1970 年 1 月 1 日 2020 年更新 您可以使用 DateTimeOffset 来做到这一点 Da
  • Pandas - 检查一个数据帧中的字符串列是否包含来自另一个数据帧的一对字符串

    这个问题是基于我问的另一个问题 我没有完全涵盖这个问题 Pandas 检查字符串列是否包含一对字符串 https stackoverflow com questions 43442591 pandas check if a string c
  • 更新每行中的列值,其中该行与同一二维数组中的另一行相同

    我有一个多维数组 如下所示 arr name gt John age gt 10 gender gt male info gt name gt Jeniffer age gt 12 gender gt female info gt name
  • 排除参数化测试类中的非参数测试

    JUnit 中是否有任何注释可以排除参数化测试类中的非参数测试 JUnit 5 从 Junit 5 0 0 开始 您现在可以使用以下方式注释您的测试方法 ParameterizedTest 所以不需要内部类 除了 ValueSource 之
  • 取消BackgroundWorker

    我在 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务 执行数据库操作 由于所有工作都是在另一个类中完成的 因此取消并不那么简单 我正在使用另一个类中的一个事件 GenerateSt
  • 在静态初始化程序中(即在 main() 之前)使用 getenv() 是否安全?

    我看了进去 并且在Posix 程序员指南 https rads stackoverflow com amzn click com 0937175730 我能找到的最好的是 称为的字符串数组环境当该过程开始时可用 该数组由外部变量指向envi