我用 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
是功能测试宏,但它不存在。
所以请帮助我理解错误的原因,因为显示错误的函数和宏是在 POSIX 标准中定义的gcc
。我不知道需要关于我的问题的更多信息,所以请告诉我,我会更新我的问题。