免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
打印 上一主题 下一主题

临时变量,static,malloc分别申请在哪里? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-04-19 09:33 |只看该作者

临时变量,static,malloc分别申请在哪里?

so库中的全局变量,buffer等在so所在段中,也就是/proc/PID/maps所显示的so段中。

还有一个概念好象是对的,

在栈中的变量一定不能全局
全局变量一定不在栈中。

论坛徽章:
0
32 [报告]
发表于 2005-04-19 10:41 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "思一克" 发表:

在栈中的变量一定不能全局
全局变量一定不在栈中。


那如果A进程和B进程都使用了该共享库文件,他们对该库中 “全局变量”的访问是否需要某种形式的同步?会发生竟态条件吗?

论坛徽章:
0
33 [报告]
发表于 2005-04-19 11:10 |只看该作者

临时变量,static,malloc分别申请在哪里?

这个我现在不100%清楚,可以实验研究。
但是在so段是真的。
我看了比如vi
的read buffer, 有许多都在那里。

如果在STACK上就无法成为全局的变量。
因为STACK变量仅仅对当时的STACK FRAME有效

论坛徽章:
0
34 [报告]
发表于 2005-04-19 11:25 |只看该作者

临时变量,static,malloc分别申请在哪里?

to albcamus

cat /proc/PID/maps

可以看到,大部分的so库都没有属性MAY_SHARE (第3列中无s, 一般为rwxp
或rwxs), 也就是他们仍然是私有的。所以不会出现你说的情况。

也有有s 的,那就不使用全局量了。

不看肯定全对。欢迎讨论

论坛徽章:
0
35 [报告]
发表于 2005-04-19 12:02 |只看该作者

临时变量,static,malloc分别申请在哪里?

算了,我还是把程序贴出来,大家看吧:

首先,头文件so.h
  1. #ifndef _SO_H
  2. #define _SO_H

  3. int data1 = 21;
  4. int data2 = 22;
  5. int data3 = 23;

  6. void so_f(int *);

  7. #endif
复制代码


然后,用以编译成so库的so.c文件:
  1. #include "so.h"


  2. extern int data1;


  3. void so_f(int *p)
  4. {
  5.         (*p) += 10;
  6.         printf("in the shared library:address is %p\n",p);
  7. }
复制代码



编译命令:
  1. [root@localhost tmp]# pwd
  2. /root/tmp
  3. [root@localhost tmp]# gcc -c -fpic so.c
  4. [root@localhost tmp]# gcc -shared so.o -o so.so
  5. [root@localhost tmp]# export LD_LIBRARY_PATH=/root/tmp/
  6. [root@localhost tmp]#
复制代码


使用共享库的程序,aa.c

  1. #include <stdio.h>;
  2. #include <string.h>;
  3. #include <stdlib.h>;

  4. #include "so.h"

  5. int main()
  6. {
  7.         extern int data1;
  8.         printf("first, data1 is %d\n",data1);
  9.         printf("well,the data1 address is %X\n",&data1);

  10.         so_f(&data1);
  11.         printf("last, data1 is %d\n",data1);

  12.         pause();

  13.         return 0;
  14. }
复制代码



另一个,超级simple的bb.c:
  1. #include <stdio.h>;
  2. #include <string.h>;
  3. #include <stdlib.h>;

  4. #include "so.h"

  5. int main()
  6. {
  7.         extern int data1;
  8.         printf("first, data1 is %d\n",data1);
  9.         printf("well,the address is 0x%p\n",&data1);
  10.         so_f(&data1);
  11.         printf("last, data1 is %d\n",data1);

  12.         return 0;
  13. }
复制代码



我把aa.c编译成aa可执行文件,bb.c编译成bb。
运行aa,然后手工cat proc的maps文件:
[root@localhost tmp]# ./aa &
[1] 5081
[root@localhost tmp]# first, data1 is 21
well,the data1 address is 0x80496d0
well,the a address is 0xbfffead4
in the shared library:address is 0x80496d0
last, data1 is 31

[root@localhost tmp]# cat /proc/5081/maps
08048000-08049000 r-xp 00000000 03:08 1267031    /root/tmp/aa
08049000-0804a000 rw-p 00000000 03:08 1267031    /root/tmp/aa
40000000-40015000 r-xp 00000000 03:08 454324     /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:08 454324     /lib/ld-2.3.2.so
40016000-40017000 rw-p 00000000 00:00 0
40017000-40018000 r-xp 00000000 03:08 1267033    /root/tmp/so.so
40018000-40019000 rw-p 00000000 03:08 1267033    /root/tmp/so.so
40019000-4001a000 rw-p 00000000 00:00 0
4002d000-4002e000 rw-p 00000000 00:00 0
42000000-4212e000 r-xp 00000000 03:08 681461     /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:08 681461     /lib/tls/libc-2.3.2.so
42131000-42133000 rw-p 00000000 00:00 0
bfffd000-c0000000 rwxp ffffe000 00:00 0
[root@localhost tmp]#



bb就不用说了吧,输出的内容是反映了不受aa程序对so中data1的改变的影响。

论坛徽章:
0
36 [报告]
发表于 2005-04-19 12:19 |只看该作者

临时变量,static,malloc分别申请在哪里?

那行打印这个?

”well,the a address is 0xbfffead4 “

论坛徽章:
0
37 [报告]
发表于 2005-04-19 12:33 |只看该作者

临时变量,static,malloc分别申请在哪里?

看errno的地址就知道了

#include <stdio.h>;
#include <errno.h>;
main()
{
    printf("address of errno = %p\n", &errno);
}

论坛徽章:
0
38 [报告]
发表于 2005-04-19 12:44 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "思一克" 发表:
那行打印这个?

”well,the a address is 0xbfffead4 “


是这样的,我在so的函数中、在aa.c中打印so中全局变量的地址,得到的地址比普通少一个十六进制位。我就打印了一个普通变量来看看,呵呵。


在so的函数中、在aa.c中打印so中全局变量的地址,得到的地址比普通少一个十六进制位。──这是为什么呢?


P.S. 我觉得errno、stderr这些是跟进程具体相关的东西,尤其是libc,恐怕不适合拿来试验

论坛徽章:
0
39 [报告]
发表于 2005-04-19 12:48 |只看该作者

临时变量,static,malloc分别申请在哪里?

albcamus

吃完午饭了?

你把so.so和main连接到一起了吧。

data1的地址是0x80496d0正好说明它是普通全局变量,而且在main的数据区,不在STACK呀

论坛徽章:
0
40 [报告]
发表于 2005-04-19 12:57 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "思一克" 发表:
albcamus

吃完午饭了?

你把so.so和main连接到一起了吧。

data1的地址是0x80496d0正好说明它是普通全局变量,而且在main的数据区,不在STACK呀


哈哈,这都被你看出来了,刚才的确吃饭去了



根据你的提示,我看了aa.c的汇编代码,发现data1、data2这样的东西根本就是在全局数据区!!这是什么原因呢?

我猜一下:1,我的so.h被include进来就导致定义了data1、data2这样的全局变量,这说明我试验的方法不对;
2,是不是so库的全局数据被各个进程放在了自己的data中?但如果这样,为什么人上面你给出的errno不是呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP