Para aquellos que no lo conozcan y para aquellos que quizás si, para POSIX C existe una variable llamada "errno" declarada dentro de errno.h como "extern int errno;". En esta variable se guarda el código de error perteneciente la ultima funciona que fallo. Por ejemplo si usamos un send o un recv, estos nos devuelven -1 indicando un error, Cual error? esta guardado en errno.
E2BIG: Argument list too long (POSIX.1)
EACCES: Permission denied (POSIX.1)
EADDRINUSE: Address already in use (POSIX.1)
EADDRNOTAVAIL: Address not available (POSIX.1)
EAFNOSUPPORT: Address family not supported (POSIX.1)
EAGAIN: Resource temporarily unavailable (may be the same value as EWOULDBLOCK) (POSIX.1)
EALREADY: Connection already in progress (POSIX.1)
EBADF: Bad file descriptor (POSIX.1)
EBADFD: File descriptor in bad state
EBADMSG: Bad message (POSIX.1)
EBADR: Invalid request descriptor
EBADRQC: Invalid request code
EBUSY: Device or resource busy (POSIX.1)
ECANCELED: Operation canceled (POSIX.1)
ECHILD: No child processes (POSIX.1)
ECHRNG: Channel number out of range
ECOMM: Communication error on send
ECONNABORTED: Connection aborted (POSIX.1)
ECONNREFUSED: Connection refused (POSIX.1)
ECONNRESET: Connection reset (POSIX.1)
EDEADLK: Resource deadlock avoided (POSIX.1)
EDEADLOCK: Synonym for EDEADLK
EDESTADDRREQ: Destination address required (POSIX.1)
EDOM: Mathematics argument out of domain of function (POSIX.1, C99)
EDQUOT: Disk quota exceeded (POSIX.1)
EEXIST: File exists (POSIX.1)
EFAULT: Bad address (POSIX.1)
EFBIG: File too large (POSIX.1)
EHOSTUNREACH: Host is unreachable (POSIX.1)
EIDRM: Identifier removed (POSIX.1)
EILSEQ: Illegal byte sequence (POSIX.1, C99)
EINPROGRESS: Operation in progress (POSIX.1)
EINTR: Interrupted function call (POSIX.1)
EINVAL: Invalid argument (POSIX.1)
EIO: Input/output error (POSIX.1)
EISCONN: Socket is connected (POSIX.1)
EISDIR: Is a directory (POSIX.1)
EISNAM: Is a named type file
EKEYEXPIRED: Key has expired
EKEYREJECTED: Key was rejected by service
EKEYREVOKED: Key has been revoked
EL2NSYNC: Level 2 not synchronized
ELIBACC: Cannot access a needed shared library
ELIBBAD: Accessing a corrupted shared library
ELIBMAX: Attempting to link in too many shared libraries
ELIBSCN: lib section in a.out corrupted
ELIBEXEC: Cannot exec a shared library directly
ELOOP: Too many levels of symbolic links (POSIX.1)
EMEDIUMTYPE: Wrong medium type
EMFILE: Too many open files (POSIX.1)
EMLINK: Too many links (POSIX.1)
EMSGSIZE: Message too long (POSIX.1)
EMULTIHOP: Multihop attempted (POSIX.1)
ENAMETOOLONG: Filename too long (POSIX.1)
ENETDOWN: Network is down (POSIX.1)
ENETRESET: Connection aborted by network (POSIX.1)
ENETUNREACH: Network unreachable (POSIX.1)
ENFILE: Too many open files in system (POSIX.1)
ENOBUFS: No buffer space available (POSIX.1 (XSI STREAMS option))
ENODATA: No message is available on the STREAM head read queue (POSIX.1)
ENODEV: No such device (POSIX.1)
ENOENT: No such file or directory (POSIX.1)
ENOEXEC: Exec format error (POSIX.1)
ENOKEY: Required key not available
ENOLCK: No locks available (POSIX.1)
Esto quiere decir que si ocurre un error en 1 thread A, luego un error en el thread B y luego en el thread A leemos el error no vamos a leer el valor de B sino que el valor que vamos a leer es el de A ( El cual es el correcto ). Esto esta definido en la especificación: