octopusgrabbus octopusgrabbus - 20 days ago 6
C Question

Why can't errno's value be printed?

I am looking at the following code in an SO "Low Quality" post to make sure the sample works, and my question is why can't I print errno's value?

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(){
FILE *fp;
errno = 0;
fp=fopen("Not_exist.txt","r");
if(fp == NULL && errno == ENOENT)
perror("file not exist");
return 0;
}


Here is what happens when I try to print the value:

(gdb) p errno
Cannot find thread-local variables on this target
(gdb)


I can print fp's value just fine. As you would expect it's value is
0x00
.

I looked at
/usr/include/errno.h
and a lot of the other include files included as part of
errno.h
, and I cannot figure out how errno is defined. Any pointers or help would be appreciated. I'm just curious about it; nothing is broken.

Thank you.

Answer

In my Ubuntu installation, I have the following section in bits/errno.h:

/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())
#  endif

That said, errno is not necessarily a variable. For various reasons you may want to have a function returning the error value for you rather than a simple extern int.1 That is why you can't print its value using GDB.

1 of course, as you can see the function call should return the pointer to the actual variable and the errno macro would dereference it.