我想使用getenv()函数。
现在我收到某人的评论,如果多个线程正在调用此函数,这将不是线程安全的。但是,如果我查看此函数的information page,它会声明:
如果环境保持不变,同时调用此函数是安全的。
我理解静态数据块的概念,并且该函数返回指向它的指针。据我所知,通过对函数进行多次调用,块的内容可以随着时间的推移而改变,作为参考页面的状态。
如果一个线程正在调用
getenv("myEnvVar1")
另一个人正在打电话
getenv("myEnvVar2")
在返回的指针指向的地方使用相同的内存块吗?我该如何解释“同时调用此函数是安全的”这一事实?
答案 0 :(得分:4)
getenv
返回一个指向ACTUAL环境内容的指针 - 因此进程有一个包含环境变量的字符串数组,你得到的不是副本,而是指向它的ACTUAL指针。
请注意,char *p = getenv("foo"); ... setenv("foo", "new value"); ... use p
也未定义,因为字符串p
指向现在可能已经改变[并且没有明确定义]
答案 1 :(得分:2)
函数getenv
是C标准库的一部分,因此它的行为由C标准集指定。
返回的字符串指针可能无效,或者后续调用
getenv()
可能会覆盖字符串内容,setenv()
,unsetenv()
或(如果支持)putenv()
,但他们不会 受到本卷中任何其他功能调用的影响 POSIX.1-2017。如果调用线程被终止,返回的字符串指针也可能无效。
getenv()
函数无需是线程安全的。
一组环境名称和改变方法 环境列表是实现定义的。
getenv
功能 不需要避免与其他修改执行线程的数据竞争 环境清单。
您无法确定getenv
本身在搜索时不会修改环境(我无法想到为什么会,但这样做不会违反标准< / em>的)。如果您想确保您使用的getenv
版本是一个线程安全的实施,您必须查阅您的实施文档以确认它是。