¿Hay alguna forma de utilizar errno de forma segura en una aplicación multihilo?


Si está escribiendo una aplicación multihilo que usa llamadas al sistema/biblioteca que hacen uso de errno para indicar el tipo de error, ¿hay una forma segura de usar errno? Si no, ¿ hay alguna otra manera de indicar el tipo de error que ocurrió en lugar de solo que se ha producido un error?

 34
Author: Erik Öjebo, 2009-01-16

2 answers

Si su biblioteca estándar es compatible con varios hilos, entonces probablemente tiene un #define que cambia errno en una llamada a función que devuelve un valor de retorno de error local de hilo. Sin embargo, para usar esto generalmente debe incluir <errno.h>, en lugar de confiar en una declaración extern.

Encontré un artículo Thread-safety y POSIX.1 que aborda esta misma cuestión.

 34
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-16 07:49:26

man errno dice:

Errno está definido por el estándar ISO C ser un lvalue modificable de tipo int, y no debe ser explícitamente declarado; errno puede ser una macro. errno es thread-local; configurándolo en uno el hilo no afecta su valor en cualquier otro hilo.

 18
Author: qrdl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-16 08:54:40