Написах мултинишкова сървърна програма на 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