免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5462 | 回复: 15
打印 上一主题 下一主题

unix下环境变量environ得问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-02 18:02 |只看该作者 |倒序浏览
我在书中看到
  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <unistd.h>;

  4. int main()
  5. {
  6.         char * * env = environ;

  7.         while (*env){
  8.                 printf("%s\n",*env);
  9.                 env++;
  10.         }
  11.         exit(0);
  12. }  
复制代码

错误如下:
  1. gcc environ.c
  2. environ.c: In function `main':
  3. environ.c:7: `environ' undeclared (first use in this function)
  4. environ.c:7: (Each undeclared identifier is reported only once
  5. environ.c:7: for each function it appears in.)
复制代码

不明白程序中怎么就能用environ

论坛徽章:
0
2 [报告]
发表于 2004-12-02 18:04 |只看该作者

unix下环境变量environ得问题

[quote]原帖由 "liuxuexin_xxlhz"]不明白程序中怎么就能用environ[/quote 发表:

加上declaration:
  1. extern char **environ
复制代码

论坛徽章:
0
3 [报告]
发表于 2004-12-02 18:21 |只看该作者

unix下环境变量environ得问题

main()函数的原型不能这么写吧?
  1. int main(int argc,char** argv,char** envp)
  2. {
  3. ……
  4. }
复制代码

就好像你把main()写成int main(),又在其中访问argc、argv会出错一样的道理。

论坛徽章:
0
4 [报告]
发表于 2004-12-02 21:41 |只看该作者

unix下环境变量environ得问题

请twen345  明示declaration:
extern char **environ 都放在那?

论坛徽章:
0
5 [报告]
发表于 2004-12-02 23:17 |只看该作者

unix下环境变量environ得问题

一个进程的环境变量是字符串数组。这些环境变量是由加载器在加载程序时,放在程序内存映像的高地址端的。environ就是指向这个字符串数组起始地址的指针。了解一下程序在运行时的内存映像就清楚了。

论坛徽章:
0
6 [报告]
发表于 2004-12-02 23:54 |只看该作者

unix下环境变量environ得问题

[quote]原帖由 "albcamus"]就好像你把main()写成int main(),又在其中访问argc、argv会出错一样的道理。[/quote 发表:

可以的.
关于是谁以及怎样取的main的参数可以看一下glibc中的代码.
和普通函数调用是一样的,放到了栈顶上

论坛徽章:
0
7 [报告]
发表于 2004-12-03 00:11 |只看该作者

unix下环境变量environ得问题

glibc 中有一个sysdeps目录主要是平台相关代码.包括了取取的系统传递参数和调用main的过程.

论坛徽章:
0
8 [报告]
发表于 2004-12-03 08:34 |只看该作者

unix下环境变量environ得问题

原帖由 "liuxuexin_xxlhz" 发表:
请twen345  明示declaration:
extern char **environ; 都放在那?

这个?放在引用它的语句之前

论坛徽章:
0
9 [报告]
发表于 2004-12-03 08:34 |只看该作者

unix下环境变量environ得问题

这个地方一向没搞清楚,只知道栈上有存放参数表和环境变量表的空间。自己理解,这也是一个进程的用户空间的一部分,象getenv之类的函数,返回的只是一串字符的第一个字符的地址。(自己想的不知道对不对呵呵)

试了一下,

  1.       1 #include <stdio.h>;
  2.       2
  3.       3 int main()
  4.       4 {
  5.       5         int i;
  6.       6         for(i = 0;i<argc;i++)
  7.       7                 printf("%s\n",argv[i]);
  8.       8
  9.       9         return 0;
  10.      10 }
复制代码

编译时提示:
  1. aa.c: In function `main':
  2. aa.c:6: `argc' undeclared (first use in this function)
  3. aa.c:6: (Each undeclared identifier is reported only once
  4. aa.c:6: for each function it appears in.)
  5. aa.c:7: `argv' undeclared (first use in this function)
复制代码


改成extern声明:

  1.       1 #include <stdio.h>;
  2.       2
  3.       3 int main()
  4.       4 {
  5.       5         extern int argc;
  6.       6         extern char *argv[];
  7.       7         int i;
  8.       8         for(i = 0;i<argc;i++)
  9.       9                 printf("%s\n",argv[i]);
  10.      10
  11.      11         return 0;
  12.      12 }
复制代码


编译提示:
  1. /tmp/ccylZphI.o(.text+0x1c): In function `main':
  2. : undefined reference to `argc'
  3. /tmp/ccylZphI.o(.text+0x2d): In function `main':
  4. : undefined reference to `argv'
  5. collect2: ld returned 1 exit status
复制代码


看来还是要改main的原型啊。别的方法不会了,朋友们说一下吧,谢了呵呵

论坛徽章:
0
10 [报告]
发表于 2004-12-03 08:39 |只看该作者

unix下环境变量environ得问题


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

  4. extern char  **environ;

  5. int main()
  6. {
  7.         char * * env = environ;

  8.         while (*env){
  9.                 printf("%s\n",*env);
  10.                 env++;
  11.         }
  12.         exit(0);
  13. }
复制代码

environ 是库中预定以的环境变量指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP