Как сделать путенв на реентерабельную функцию? - PullRequest
0 голосов
/ 26 сентября 2019

Функция putenv не является поточно-ориентированной функцией, поэтому я предполагаю, что если я вызову pthread_mutex_lock перед вызовом putenv, могу ли я сделать 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;
}

1 Ответ

3 голосов
/ 26 сентября 2019

putenv повторно используется в новых версиях glibc.Проблема в том, что putenv не копирует данную ему строку, и поэтому вы не можете использовать ее в своем стеке.Попробуйте сохранить char env[100] в месте, где он не будет уничтожен в конце функции.

Функция putenv () не обязательна для повторного входа, а функция в glibc 2.0 - нет,но версия glibc 2.1.

...

Начиная с версии 2.1.2, реализация glibc соответствует SUSv2: используется строка указателя, заданная для putenv ().В частности, эта строка становится частью среды;изменение этого позже изменит окружающую среду.(Таким образом, ошибка вызывать putenv () с автоматической переменной в качестве аргумента, а затем возвращаться из вызывающей функции, пока строка все еще является частью среды.)

...