关于POSIX标准下的Pthread函数不能使用errno变量的验证

问题缘起

在《POSIX多线程程序设计》中,1.9节提到
关于POSIX标准下的Pthread函数不能使用errno变量的验证_第1张图片
下面验证这个问题!

代码

代码在我的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文件看看,结果也只是在各种文件中打转,没有找到关键的地方。

你可能感兴趣的:(诸公指正)