出于某种原因,我在调用 pthread_create 之前使用 pthread_attr_setstack 函数为我的应用程序中的所有线程创建自己的堆栈。但是,我也希望为我的主线程提供一个自定义堆栈。我怎样才能做到这一点?
如果不可能,我怎么能至少得到主线程的堆栈地址和大小?
答案 0 :(得分:7)
但是,我也希望为我的主线程提供自定义堆栈。
你做不到。主线程的堆栈由OS elf loader创建。主堆栈的大小不是静态固定的(只有上限,通过ulimit -s)。每次需要时,操作系统都会增加堆栈。
我怎样才能实现这一目标?
您只能通过重置%sp,%bp寄存器来切换堆栈。你应该非常小心地这样做,最好在退出之前重新设置它们。
如果那是不可能的,我怎么能至少得到堆栈地址
您可以通过以下方式估算堆栈地址:
int main()
{
int a;
printf("Stackaddress is near %p\n", &a);
}
您可以阅读申请的/proc/pid/maps
文件并查看标有[stack]
的地址范围
和主线程的大小?
主堆栈的大小不固定。程序启动时,该堆栈几乎为空(包含argv / envp / auxp - 由OS填充);并且每次访问尚未使用的堆栈页面时它都会增长(不缩小)。这是页面错误的一个特例,操作系统会检测到页面错误看起来像堆栈访问,并会将更多的物理页面提供给应用程序的虚拟地址空间。
答案 1 :(得分:2)
由于在完成任何线程特定的初始化之前调用main函数,我认为你不能影响它的堆栈。但是,您可以简单地为main编写一个包装器,它启动一个线程来执行main的常用代码然后只是等待。