多线程编程指南

设置栈溢出保护区大小

pthread_attr_setguardsize(3C) 可以设置 attr 对象的 guardsize

pthread_attr_setguardsize(3C) 语法

#include <pthread.h>



int pthread_attr_setguardsize(pthread_attr_t *attr, size_t  guardsize);

出于以下两个原因,为应用程序提供了 guardsize 属性:

guardsize 参数提供了对栈指针溢出的保护。如果创建线程的栈时使用了保护功能,则实现会在栈的溢出端分配额外内存。此额外内存的作用与缓冲区一样,可以防止栈指针的栈溢出。如果应用程序溢出到此缓冲区中,这个错误可能会导致 SIGSEGV 信号被发送给该线程。

如果 guardsize 为零,则不会为使用 attr 创建的线程提供溢出保护区。如果 guardsize 大于零,则会为每个使用 attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区。缺省情况下,线程具有实现定义的非零溢出保护区。

允许合乎惯例的实现,将 guardsize 的值向上舍入为可配置的系统变量 PAGESIZE 的倍数。请参见 sys/mman.h 中的 PAGESIZE。如果实现将 guardsize 的值向上舍入为 PAGESIZE 的倍数,则以 guardsize(先前调用 pthread_attr_setguardsize() 时指定的溢出保护区大小)为单位存储对指定 attrpthread_attr_getguardsize() 的调用。

pthread_attr_setguardsize 返回值

如果出现以下情况,pthread_attr_setguardsize() 将失败:


EINVAL

描述:

参数 attr 无效,参数 guardsize 无效,或参数 guardsize 包含无效值。