[英]How to make putenv to a reentrant function?
function putenv
不是線程安全的 function,所以我想如果我在調用putenv
之前調用pthread_mutex_lock
,我可以通過這種方式使putenv
“線程安全”嗎?
我試過了,但是當我運行它時,出現了分段錯誤。
這是代碼:
#include "apue.h"
#include <pthread.h>
pthread_mutex_t envlock = PTHREAD_MUTEX_INITIALIZER;
void thread_func(void*arg){
pthread_mutex_lock(&envlock);
char env[100];
sprintf(env,"hhh=%s",(char*)arg);
putenv(env);
pthread_mutex_unlock(&envlock);
return;
}
int main(){
pthread_t thread0, thread1, thread2;
void *shit;
int err;
char name0[]="thread0";
err=pthread_create(&thread0,NULL,thread_func,(void*)name0);
if(err!=0)
exit(-1);
char name1[]="thread1";
err=pthread_create(&thread1,NULL,thread_func,(void*)name1);
if(err!=0)
exit(-1);
char name2[]="thread2";
err=pthread_create(&thread2,NULL,thread_func,(void*)name2);
if(err!=0)
exit(-1);
pthread_join(thread0,&shit);
pthread_join(thread1,&shit);
pthread_join(thread2,&shit);
char *hhh=getenv("hhh");
printf("hhh is =%s",hhh);
return 0;
}
putenv
在較新版本的 glibc 中是可重入的。 問題是putenv
不會復制給它的字符串,因此您不能將它基於您的堆棧。 嘗試將您的char env[100]
保存在函數結束時不會被破壞的地方。
putenv() function 不需要可重入,glibc 2.0 中的不需要,但 glibc 2.1 版本是。
...
從 2.1.2 版本開始,glibc 實現符合 SUSv2:使用了給 putenv() 的指針字符串。 特別是,這個字符串成為環境的一部分; 以后改變它會改變環境。 (因此,使用自動變量作為參數調用 putenv() 是錯誤的,然后在字符串仍然是環境的一部分時從調用 function 返回。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.