LinuxLinux学习之路

APUE读书笔记-07进程环境(2)

2020-05-10  本文已影响0人  QuietHeart

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 CPOSIX.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

译者注

原文参考

参考: APUE2/ch07lev1sec4.html

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 字符结尾的字符串(一般就是某个环境变量的声明)。

译者注

原文参考

参考: APUE2/ch07lev1sec5.html

上一篇 下一篇

猜你喜欢

热点阅读