問題緣起
在《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
文件看看,結果也只是在各種文件中打轉,沒有找到關鍵的地方。