乌拉乌拉liang 2022-10-22 06:01 采纳率: 60%
浏览 42
已结题

c线程的guard问题

在测试c线程guard区域时候的一些疑问。本以为设置了guardsize,线程有了自己的保护内存段了,当访问到这段内存的时候才会由系统内核发出SIGSEGV信号。我的问题是为什么guardsize设置为0了,超出栈大小了也会有SIGSEGV信号?
这个不太懂了。


```c++
#include "iostream"
#include "pthread.h" 
#include "unistd.h"  
#include "semaphore.h"
#include "signal.h"
#include "errno.h"
#include "stdlib.h"
#include "sys/mman.h"

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while(0)

static char *buffer;
void signal_handler(int sig) {
    void *frame_addr = __builtin_frame_address(0);
    printf("Got SIGSEGV at address: 0x%lx\n", frame_addr);
    exit(EXIT_FAILURE);
}
void *thread_function(void *arg) {
    sleep(1);
    char p[1];
    int i;
    for (i = 0; i < 1024; ++i) {
//        printf("[%d]\n", i);
        printf("[%d] access address: %p\n", i, &p[i * 1024]);
//        printf("[%d]\n", i);
        p[i * 1024] = 'a';
    }
    printf("thread_function \n");
}
void main() {
    //线程的guard区域同样是PROT_NONE的,如果访问这段内存,同样会使系统内核发出SIGSEGV信号
    signal(SIGSEGV, signal_handler);
    size_t pagesize = sysconf(_SC_PAGESIZE);
    size_t guardsize = pagesize;
    size_t stacksize = pagesize;
    printf("pagesize:%d\n", pagesize);
    char stack_addr[8196];
    pthread_attr_t attr_t;
    pthread_t tid;
    pthread_attr_init(&attr_t);
    pthread_attr_setstacksize(&attr_t, stacksize);
    pthread_attr_setguardsize(&attr_t, 0);
    pthread_attr_setstackaddr(&attr_t, &stack_addr);

    pthread_create(&tid, &attr_t, thread_function, NULL);

    pthread_attr_getguardsize(&attr_t, &guardsize);
    pthread_attr_getstacksize(&attr_t, &stacksize);
    printf("guardsize:%d stacksize:%d\n", guardsize, stacksize);

    pthread_join(tid, NULL);
}

```

  • 写回答

2条回答 默认 最新

  • Jackyin0720 2022-10-22 08:05
    关注

    【guardsize设置为0,SIGSEGV还有信号】
    分析思路:
    原因一: 溢出保护可能会导致系统资源浪费。如果应用程序创建大量线程,并且已知这些线程永远不会溢出其栈,则可以关闭溢出保护区。通过关闭溢出保护区,可以节省系统资源。

    原因二:线程在栈上分配大型数据结构时,可能需要较大的溢出保护区来检测栈溢出。
    参考链接【线程属性详解】,期望对你有所帮助:https://blog.csdn.net/KingOfMyHeart/article/details/97614255

    评论

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 赞助了问题酬金15元 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀