Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1426722
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: 系统运维

2012-05-14 17:00:18

一个C函数从执行一个名为main的函数开始。main函数的原型为:


int main(int argc, char *argv[]);


argc是命令行参数的数量而argv是参数指针的数组。我们在7.4节讨论这些参数。


当一个C程序被内核执行时--通过一个exec函数,我们在8.10节讨论--一个特殊的启动程序在main函数调用前被调用。这个可执行程序文件指定了 这个程序,作为程序的开始地址;这是由C编译器调用的链接编辑器设置的。这个启动程序从内核得到几个值--命令行参数和环境--然后把事情设置好以便 main函数像之前所述的那样被调用。



当一个程序被执行时,使用exec的进程可以传递命令行参数给这个新的程序。这是UNIX系统外壳的普通操作的一部分。我们在前面章节中的很多例子里已经看到过。


看下面的例子:



  1. #include <stdio.h>

  2. int
  3. main(int argc, char *argv[])
  4. {
  5.     int i;

  6.     for (i = 0; i < argc; i++) /* echo all command-line args */
  7.         printf("argv[%d]: %s\n", i, argv[i]);
  8.     exit(0);
  9. }


  $ ./a.out 123 hello good "bye bye"
argv[0]: ./a.out
argv[1]: 123
argv[2]: hello
argv[3]: good
argv[4]: bye bye

我们被ISO C和POSIX.1两者保证argv[argc]是一个空指针。这允许我们用另一种方式编码参数处理循环:
for (i = 0; argv[i] != NULL; i++)




每个程序还被传入一个环境列表。就像参数列表那样,环境列表是一个字符指针的数组,每个指针包含一个以null终止的C字符串的地址。这个指针数组的地址包含在全局变量environ里:


extern char **environ;


例如,如果环境由5个字符串组成,那environ就指向一个长度为5的指针数组。数组里的每个地址都指向一个如“HOME=/home/tommy\0”形式的字符串。这里显式地给出最后的终止符。


我们称environ为环境指针,称指针数组为环境列表 。称它们指向的字符串为环境字符串。


根据协议,环境由字符串name=value组成。多数预定义的名字是完全大写的,但这只是一个协议而已。 


历史上,多数UNIX系统 ,为main函数提供第三个参数,它是环境列表的地址:


int main (int argc, char *argv[], char *envp[]);


因为ISO C指出,main 函数有两个参数,而又因为第三个参数没有提供比全局变量environ更好的功能,所以POSIX.1 指出environ应该用来代替那个(可能的)第三个参数。访问特定的环境变量通常是通过getenv和putenv函数,在7.9节讨论,而不是通过 environ变量。然而要遍历整个环境变量,environ指针必须被使用。

阅读(371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~