要使 getenv_r 可重入,需要改變介面,呼叫者必須自己提供緩衝區,這樣每個執行緒可以使用各自不同的緩衝區從而避免其他執行緒的干擾。但是注意這還不足以使 getenv_r 成為執行緒安全的,要使 getenv_r 成為執行緒安全的, 需要在搜尋請求的字串時保護環境不被修改。我們可以使用互斥量,通過 getenv_r 和 putenv 函式對環境列表的訪問進行序列化。
#include #include #include #include #include #include #define arg_max 100
#define bufsize 100
extern char **environ;
pthread_mutex_t env_mutex;
static pthread_once_t init_done = pthread_once_init;
static void thread_init(void)
int getenv_r(const char *name, char *buf, int buflen)
strcpy(buf, &environ[i][len+1]);
pthread_mutex_unlock(&env_mutex);
return 0;
} }pthread_mutex_unlock(&env_mutex);
return enoent;
}void *thr_func(void *arg)
printf("thread 1: %s\n", buf);
return (void *)0;
}int main()
char buf[bufsize];
err = getenv_r("job", buf, bufsize);
if (err != 0)
printf("main part: %s\n", buf);
sleep(1);
return 0;
}
可重入函式 可重入核心
可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...
可重入核心 可重入函式
可重入核心在ulk 深入理解linux核心 中的定義是指若干個程序可以同時在核心態下執行,也就是說多個程序可以在核心態下併發執行核心 在單處理器上,只能實現 微觀上的序列,巨集觀上的並行,即任意時刻,只有乙個進 正執行,其他程序處於阻塞或者等待狀態。這裡的可重入,是指可以多個程序進入核心,並不是重複...
可重入 不可重入
在任務執行期間捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理程式臨時中斷。如果從訊號處理程式返回,則繼續執行程序斷點處的正常指令序列,從重新恢復到斷點重新執行的過程中,函式所依賴的環境沒有發生改變,就說這個函式是可重入的,反之就是不可重入的。眾所周知,在程序中斷期間,系統會儲存和恢復...