Rock姜 2022-10-22 06:01 采纳率: 60%
浏览 41
已结题

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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效