c - 为什么在 POSIX/IEEE 标准中 pthread_mutexattr_settype() 需要 _GNU_SOURCE 宏?

标签 c multithreading gcc client-server language-features

我用 C 编写了一个多线程服务器程序,它回显客户端发送的所有数据。

最初,我使用 poll()在我的程序中检测POLLRDHUP的函数事件,为此我定义了 _GNU_SOURCE宏(此事件定义为 here )。

后来我更新了我的代码并删除了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));

checked out here检查是否__USE_UNIX98是一个功能测试宏,但它不在那里。

所以请帮助我理解错误的原因,因为函数和宏在哪里gcc显示错误 are defined in POSIX standard 。我不知道还需要什么关于我的问题的更多信息,所以请告诉我,我会更新我的问题。

最佳答案

你应该使用

#define _POSIX_C_SOURCE 200112L

如果您想使用 POSIX 功能,例如 pthread_mutexattr_settype ... 请参阅 http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html

另一种可能是

#define _XOPEN_SOURCE 700

参见 http://man7.org/linux/man-pages/man7/feature_test_macros.7.htmlhttp://pubs.opengroup.org/onlinepubs/9699919799/

设置 _GNU_SOURCE 包括 POSIX 和许多其他定义。

附言我希望包括 <pthread.h>包括 <features.h> ,默认情况下将 _POSIX_C_SOURCE 定义为 200112L,但您可能定义了一些覆盖它的东西......请参阅系统上的/usr/include/features.h 以了解符号及其用法的详细信息。

关于c - 为什么在 POSIX/IEEE 标准中 pthread_mutexattr_settype() 需要 _GNU_SOURCE 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18375527/

相关文章:

multithreading - TMREWSync(TMultiReadExclusiveWriteSynchronizer)问题

c - 为什么这段代码可以在 gcc 6.3.0 上运行,而不能在 4.9.2 上运行?

c - 为什么右移 64 位是恒等式而不是幂零(返回 0)?

c++ - 为什么 Mac 上的 clang 会自动包含一些缺失的 header ?

c++ - GCC/G++ 对 : void* to int 的不同态度

java - 如何让 TestNG 在关闭之前等待我的测试完成

java - 如何将数据从线程发送到主要 Activity java android

c - 如何从c中的字符串中分离整数和运算符?

c - 估计线程堆栈大小

c - 使用格式字符串打印返回地址