C語言多線程中使用errno全局變量的問題

        在C語言中,不管理Unix/Linux還是Windows下,每次系統調用或庫函數調用後,如果判斷返回值不對,需要調用errno全局變量來判斷具體錯誤。既然errno是全局變量,那麼如果在多線程函數中它不會被別的線程充掉嗎?顯然不是,通過查看相關定義,僅以Unix/Linux爲例,可以得出兩個結論:
1. errno是per-thread的,也就是說errno定義和存儲是對於線程而言的,與別的線程毫無關係;
2. errno調用最終是一個調用,每使用一次都會調用一次函數。
與錯誤處理相關的兩個函數perror,strerror內部調用的也都是線程存儲的變量,看看FreeBSD中對strerror的定義:
char*
strerror(int err)
{
   static char msg[32];
   int i;
   for(i=0;errtab[i].msg !=NULL;i++)
    if(errtab[i].err == err)
       return (errtab[i].msg);
   sprintf(msg,"unknown error (%d)",err);
}

errtab數組是定義的本線程的全局變量。

Linux中實現的細節可參看以下文章,講得比較透徹:
https://blog.csdn.net/weixin_35695879/article/details/89530417

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章