名称

pthread_attr_setguardsize,pthread_attr_getguardsize-在线程属性对象中设置/获取防护大小属性

语法

#include <pthread.h>

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);

Compile and link with -pthread.

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
pthread_attr_setguardsize(),pthread_attr_getguardsize()Thread safetyMT-Safe

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

PTHREAD_ATTR_SETGUARDSIZE - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

BUGS

与glibc 2.8一样,NPTL线程实现在堆栈大小分配中包括保护区域,而不是按照POSIX.1的要求在堆栈末尾分配额外的空间。 (如果保护大小值太大,则可能会从pthread_create(3)导致EINVAL错误,而实际堆栈没有空间。)

过时的LinuxThreads实现做对了,在堆栈末尾为保护区域分配了额外的空间。

示例

请参见pthread_getattr_np(3)。

错误说明

如果attr或guardsize无效,则POSIX.1将记录EINVAL错误。在Linux上,这些功能始终会成功(但是可移植且面向未来的应用程序仍应处理可能的错误返回)。

版本

从2.1版开始,这些功能由glibc提供。

备注

保护区域由受保护以防止读写访问的虚拟内存页面组成。如果线程将其堆栈溢出到保护区域中,则在大多数硬体系结构上,它都会收到SIGSEGV信号,从而将溢出通知给它。保护区域从页面边界开始,并且在创建线程时将保护大小在内部舍入为系统页面大小。 (尽管如此,pthread_attr_getguardsize()返回由pthread_attr_setguardsize()设置的防护大小。)

将保护大小设置为0可能有助于在创建许多线程并且知道永远不会发生堆栈溢出的应用程序中节省内存。

如果线程在堆栈上分配了较大的数据结构,则可能需要选择大于默认大小的保护大小来检测堆栈溢出。

返回值

成功时,这些函数返回0;否则,返回0。错误时,它们返回非零错误号。

遵循规范

POSIX.1-2001,POSIX.1-2008。

说明

pthread_attr_setguardsize()函数将attr引用的线程属性对象的保护大小属性设置为guardsize中指定的值。

如果guardsize大于0,则对于使用attr创建的每个新线程,系统都会在线程堆栈的末尾分配至少guardsize字节的附加区域,以用作堆栈的保护区域(但请参阅BUGS)。

如果guardsize为0,那么使用attr创建的新线程将没有保护区。

默认防护大小与系统页面大小相同。

如果已在attr中设置了堆栈地址属性(使用pthread_attr_setstack(3)或pthread_attr_setstackaddr(3)),这意味着调用方正在分配线程的堆栈,则将忽略保护大小属性(即,保护区不会由保护区创建)系统):处理堆栈溢出是应用程序的责任(也许通过使用mprotect(2)在已分配的堆栈末尾手动定义保护区域)。

pthread_attr_getguardsize()函数在guardsize指向的缓冲区中返回attr引用的线程属性对象的保护大小属性。

日期:2019-08-20 18:01:01 来源:oir作者:oir