關於POSIX標準下的Pthread函數不能使用errno變量的驗證

問題緣起

在《POSIX多線程程序設計》中,1.9節提到
這裏寫圖片描述
下面驗證這個問題!

代碼

代碼在我的CSDN碼雲上邊,應該可以自由下載,如果不行請聯繫我!
地址:https://gitee.com/CPU1994Hz/codes/w75d9t2hpzbmiu8goqkaj76#errors.h

關於編譯時候的警告

這個代碼故意漏了一個錯誤,就是爲了檢測報錯機制,所以編譯的時候,會有一個警告:

root@ubuntu:/mnt/hgfs/PFolder/Programming with POSIX Threads/Chapter1.9# make
gcc -g -Wall -I./include -c src/main.c -o obj/main.o -lpthread -lsqlite3
src/main.c: In function ‘main’:
src/main.c:27:12: warning: ‘thread’ is used uninitialized in this function [-Wuninitialized]
     status = pthread_join(thread, NULL);
            ^
gcc  ./obj/main.o -o bin/main.out -lpthread -lsqlite3
root@ubuntu:/mnt/hgfs/PFolder/Programming with POSIX Threads/Chapter1.9# 

不用在意它。

結果

運行後:
這裏寫圖片描述

分析

因爲我的線程ID是沒有初始化的,是不能用的,所以肯定出錯。
1.從代碼分析,第一個宏調用是把返回值默認成errno來用,它能很好的識別。

main.c err at "src/main.c":29: No such process

這就說明Pthread函數雖然不能使用errno變量來指明錯誤,但它還是把錯誤以返回值的形式給你了,你必須自己用變量承接。
2.第二個宏調用就驗證了這一點,我們在宏中強行使用errno這個變量,結果因爲Pthread函數是不能設置errno的,導致errno一開始也是沒有初始化的,最後段錯誤了。

已放棄 (核心已轉儲)

話外

關於errno.h這個頭文件的引用,一開始作者不明白,如果Pthread不能設置errno變量,那爲何還用應用它呢?
作者試圖去errno.h文件看看,結果也只是在各種文件中打轉,沒有找到關鍵的地方。

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