Don*_*ild 9 c multithreading language-features gcc client-server
我用C 编写了一个多线程服务器程序,它回显客户端发送的所有数据.
最初,我poll()在我的程序中使用函数来检测POLLRDHUP事件,为此我定义了_GNU_SOURCE宏(这里定义了此事件).
后来我更新了我的代码和删除的poll()功能,但我忘了删除_GNU_SOURCE宏.
现在我的代码终于完成了(有点长,发布超过250行).在删除宏之前,我正在编译我的程序:
gcc multi_thread_socket_v4.c -Wall -Werror -g -lpthread -o multi_thread_socket
Run Code Online (Sandbox Code Playgroud)
它工作正常:没有错误,没有警告
删除宏定义并使用相同的命令行编译后,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.)
Run Code Online (Sandbox Code Playgroud)
我已经包含了所有必需的库,因为它最初工作正常.
我偷看成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
};
Run Code Online (Sandbox Code Playgroud)
还有这个:
#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));
Run Code Online (Sandbox Code Playgroud)
我在这里查看是否__USE_UNIX98是功能测试宏,但它不存在.
所以请帮我理解错误的原因,因为功能和gcc显示错误的宏在POSIX标准中定义.我不知道有什么更多关于我的问题的信息需要,所以请告诉我,我会更新我的问题.
你应该使用
#define _POSIX_C_SOURCE 200112L
Run Code Online (Sandbox Code Playgroud)
如果您想使用 pthread_mutexattr_settype 等 POSIX 功能...请参阅http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html
另一种可能是
#define _XOPEN_SOURCE 700
Run Code Online (Sandbox Code Playgroud)
见http://man7.org/linux/man-pages/man7/feature_test_macros.7.html和http://pubs.opengroup.org/onlinepubs/9699919799/
设置 _GNU_SOURCE 包括 POSIX 和许多其他定义。
PS 我希望包括<pthread.h>includes <features.h>,默认情况下将 _POSIX_C_SOURCE 定义为 200112L,但您可能定义了一些覆盖...的内容,请参阅系统上的 /usr/include/features.h 以了解符号及其用法的详细信息.
| 归档时间: |
|
| 查看次数: |
4735 次 |
| 最近记录: |