簡體   English   中英

如何使 putenv 成為可重入的 function?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM