我们知道在linux下多线程之间,是共用同一片存储区域的,可以访问共享的全局变量等,但是能否访问线程内部的局部变量呢,会不会出现越界异常呢?今天笔者尝试了一下,发现可以在线程间越界访问!
代码如下:
/* * Author:yaronli <jidalyg_8711@163.com> * http://www.yaronspace.cn/blog * * File: hookpthread.c * Create Date: 2011-03-27 21:22:31 * */ #include#include void * fun(void * i) { int a=20; printf("fun: &a;:[%x]-----a:[%d]\n", &a,a); sleep(3); printf("fun: &a;:[%x]-----a:[%d]\n", &a,a); pthread_exit(NULL); } void * hook(void * a) { int b=10; sleep(1); printf("hook: &b;:[%x]\n", &b); printf("hook: &a;:[%d]\n", *(&b-10489856/4)); *(&b-10489856/4)=30; pthread_exit(NULL); } int main() { pthread_t pidfun,pidhook; pthread_create(&pidfun, NULL, fun, NULL); pthread_create(&pidhook, NULL, hook, NULL); sleep(5); return 0; } /* vim: set ts=4 sw=4: */
该程序首先是在启动两个线程,在fun线程中设置局部变量a=20并显示出来,在hook线程中尝试读取a的变量值并试图更改它,然后再次显示变量a的值
在我的机器上的输出如下:
fun: &a:[419c512c]-----a:[20] hook: &b:[423c612c] hook: &a:[20] fun: &a:[419c512c]-----a:[30]
可以发现a的在值在线程hook中被修改成功了,并没有出现越界访问异常
TIPS:
1. 10489856/4 关于这个值的获取是通过&b和&a的地址相减得到的,至于为什么除4,是因为&b是int型的指针,而指针的加减法的单位是4个字节,所以需要除以4,这里我也是调试好半边才搞明白的.