linux的线程是否受到了保护?

本文通过一个具体的实验展示了在Linux环境下,同一进程内的线程可能会遇到内存越界访问的问题,并提供了一段示例代码来说明这一现象。
linux同一个进程下面的线程都是在同一个进程空间的,那么是否会存在越界访问的问题呢?
刚刚做了一个试验,答案是:存在越界问题。

[root@FC5 thread]# gcc -o hk hookpthread.c -lpthread;./hk;cat hookpthread.c
&a:[b7f77464]-----a:[20]
&b:[b7576464]
hook-->&a:[20]
&a:[b7f77464]-----a:[30]
#include <stdio.h>
#include <pthread.h>
void * fun(void * i)
{
int a=20;
printf("&a:[%x]-----a:[%d]/n", &a,a);
sleep(1);
printf("&a:[%x]-----a:[%d]/n", &a,a);
pthread_exit(NULL);

}

void * hook(void * a)
{
int b=10;
printf("&b:[%x]/n", &b);
printf("hook-->&a:[%d]/n", *(&b+2622464));
*(&b+2622464)=30;
pthread_exit(NULL);

}
int main()
{
pthread_t pidfun,pidhook;
pthread_create(&pidfun, NULL, fun, NULL);
pthread_create(&pidhook, NULL, hook, NULL);
sleep(2);
return 0;
}


 
<think>好的,我现在需要回答用户关于Linux系统中线程默认栈大小的问题。首先,我需要回顾一下用户提供的引用内容,确保信息准确。 根据引用[1],Linux使用pthread库创建线程时,默认栈大小因系统和版本不同,可能在2MB到8MB之间。引用[2]提到默认是8MB,但某些情况可能需要调整。引用[3]中的代码示例显示栈大小为8388608字节,即8MB。引用[4]也指出默认是8MB,但创建时可能用2M。 这里可能存在矛盾,需要进一步核实。通常,pthread_create的默认栈大小由pthread_attr_getstacksize获取,而引用3中的结果明确是8MB。而引用4提到mmap创建2M,这可能是在特定环境下的情况,或者是主线程和子线程的区别。主线程的栈通常由系统决定,可能更大,而子线程默认是8MB,但实际分配可能延迟到使用时。此外,不同Linux发行版可能有差异,比如CentOS和Ubuntu可能有不同的默认设置。 需要明确回答用户:默认栈大小通常是8MB,但可能因系统或配置不同而变化。同时,用户可以通过命令或代码查看具体系统的默认值。例如,使用ulimit -s查看主线程栈大小,而线程的默认栈可能受此影响,或者由pthread库决定。因此,总结时需提到8MB是常见默认值,但建议用户检查具体环境。</think>在Linux系统中,线程的默认栈大小根据系统配置和线程创建方式有所不同,但通常遵循以下规律: 1. **主线程栈大小** 主线程(即程序初始线程)的栈大小由系统环境变量决定,可通过`ulimit -s`命令查看,默认值通常为**8MB**。 2. **子线程默认栈大小** 使用POSIX线程库(pthread)创建的子线程,默认栈大小一般为**8MB**。通过代码验证如下: ```c #include <pthread.h> #include <stdio.h> int main() { pthread_attr_t attr; size_t stacksize; pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &stacksize); printf("Thread stack size = %zu bytes\n", stacksize); // 输出8388608字节(8MB) return 0; } ``` 这与多数Linux发行版的默认配置一致[^3][^4]。 3. **实际内存分配** 虽然默认设置为8MB,但操作系统可能采用延迟分配策略(如COW技术),实际物理内存占用会根据线程运行时的栈使用量动态调整[^4]。 4. **系统差异性** 部分嵌入式系统或特殊配置环境下,默认栈大小可能调整为2MB或其他值,需通过`pthread_attr_getstacksize`或`/proc/<pid>/maps`文件确认具体分配值[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值