4、程序的命令行参数
程序的命令行参数是 main
的参数 argc
, argv
指定的。前面第7章第2节说过这里不重复了。注意的是,c程序的 main
函数参数和 java
程序的 main
函数参数有些不同,c程序中:参数 argc
是命令行中参数的数目(c包含命令名而 java
不含), argv
是指向命令行参数的数组(c中 argv[0]
是命令名而 java
不含)。
下面的例子程序会打印出传递给该程序的所有命令行的参数,这个程序名称叫做 echoarg
。和 Linux
上面 echo(1)
不同的是,它并不打印第0个参数(即它本身的名称)。
将所有的命令行参数打印到标准输出的例子:
#include "apue.h"
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++) /* echo all command-line args */
printf("argv[%d]: %s\n", i, argv[i]);
exit(0);
}
对于上述代码, ISO C
和 POSIX.1
都能够保证 argv[argc]
是一个空指针。所以我们可以用循环 "for (i = 0; argv[i] != NULL; i++)”判断。运行该程序的输出如下:
$ ./echoarg arg1 TEST foo
argv[0]: ./echoarg
argv[1]: arg1
argv[2]: TEST
argv[3]: foo
译者注
原文参考
5、程序的环境变量列表
类似参数列表,每个程序都有一个环境变量列表,不过不通过参数指定,而是通过全局变量 environ
来指定。这个变量是:
extern char **environ;
其元素是一系列以 NULL
结束的字符串(形式是 :name=value
)。
原来环境变量列表是通过为 main
指定第3个参数来传递的,不过现在看来对于一个全局变量来说没有必要这么做了,又因为 ISO C
的规定所以 main
就只有两个参数了。有专门的接口访问指定的环境变量,但是如果想要遍历整个环境变量列表那么就需要通过这个 environ
全局变量了。
具体点说,环境变量声明的格式为:
name=value
例如,如果有一个包含5个字符串环境变量的环境,那么其情况大致如下图所示:
environment environment environment
pointer list strings
+------+ +-------+
environ:| --+--------->| --+---->HOME=/home/sar\0
+------+ +-------+
| --+---->PATH=:/bin:/usr/bin\0
+-------+
| --+---->SHELL=/bin/bash\n
+-------+
| --+---->USER=sar\0
+-------+
| --+---->LOGNAME=sar\0
+-------+
| NULL |
+-------+
这里 environ
就是环境指针,指向环境列表这个字符串数组,而环境列表的数组中的每个字符串是一个以 NULL
字符结尾的字符串(一般就是某个环境变量的声明)。
网友评论