Я написал многопоточную серверную программу на языке C, которая возвращает все данные, отправляемые клиентом.
Первоначально я использовал функцию poll()
в своей программе для обнаружения события POLLRDHUP
, для этого я определил макрос _GNU_SOURCE
(это событие определено здесь).
Позже я обновил свой код и удалил функцию poll()
, однако забыл удалить макрос _GNU_SOURCE
.
Теперь мой код, наконец, завершен (и немного длинный для публикации, более 250 строк). Перед удалением макроса я компилировал свою программу, используя:
gcc multi_thread_socket_v4.c -Wall -Werror -g -lpthread -o multi_thread_socket
и он работал нормально: ни ошибок, ни предупреждений
После того, как я удалил определение макроса и скомпилировал его с помощью той же командной строки, вывод gcc был таким:
multi_thread_socket_v4.c: In function ‘main’:
multi_thread_socket_v4.c:194: warning: implicit declaration of function ‘pthread_mutexattr_settype’
multi_thread_socket_v4.c:194: error: ‘PTHREAD_MUTEX_ERRORCHECK’ undeclared (first use in this function)
multi_thread_socket_v4.c:194: error: (Each undeclared identifier is reported only once
multi_thread_socket_v4.c:194: error: for each function it appears in.)
Я включил все необходимые библиотеки, так как изначально все работало нормально.
Я заглянул в pthread.h
на /usr/include/pthread.h
и узнал следующее:
/* Mutex types. */
enum
{
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_ADAPTIVE_NP
#ifdef __USE_UNIX98
,
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
#endif
#ifdef __USE_GNU
/* For compatibility. */
, PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP
#endif
};
и это:
#ifdef __USE_UNIX98
/* Return in *KIND the mutex kind attribute in *ATTR. */
extern int pthread_mutexattr_gettype (__const pthread_mutexattr_t *__restrict
__attr, int *__restrict __kind)
__THROW __nonnull ((1, 2));
/* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
PTHREAD_MUTEX_DEFAULT). */
extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
__THROW __nonnull ((1));
Я проверил здесь, чтобы проверить, является ли __USE_UNIX98
макросом тестирования функций, но его там не было. .
Поэтому, пожалуйста, помогите мне понять причины ошибки, потому что функция и макрос, где gcc
, показывают ошибку определены в стандарте POSIX. Я не знаю, какая дополнительная информация о моей проблеме потребуется, поэтому, пожалуйста, скажите мне, я обновлю свой вопрос.
_GNU_SOURCE
и_BSD_SOURCE
, чтобы управлять тем, какие части библиотеки извлекаются. - person Kerrek SB   schedule 22.08.2013pthread_setattr_settype()
и макросPTHREAD_MUTEX_ERRORCHECK
являются стандартом POSIX , так зачем им нужно, чтобы_GNU_SOURCE
было определено? - person Don't You Worry Child   schedule 22.08.2013