gnu coreutils printenv.c源码分析

本文深入探讨了printenv.c程序的工作原理,详细解释了如何通过遍历环境变量数组environ来打印所有环境变量,以及如何查找并打印指定的环境变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


printenv.c很有意思的。代码同样简短,但有一个地方很怪,只是定义了一个外部变量,不是定义,只是声明。
extern char **environ;
后面就可以以打印全部环境变量
     for (env = environ; *env != NULL; ++env)
 puts (*env);
真是奇怪了。我找了environ,好象也只是一个宏,这个以后再细究。
开始我也不明白,这个命令究竟是做什么的,把代码本地编译一次,再执行,原来这个程序就是打印环境变量,不带参数,把全部环境变量打印;带参数,就把参数当环境变量打印出来。
其中把指定环境变量打印出来的那段,很有意思
      for (i = optind; i < argc; ++i)
 {
   for (env = environ; *env; ++env)
     {
       ep = *env;
       ap = argv[i];
       while (*ep != '\0' && *ap != '\0' && *ep++ == *ap++)
  {
    if (*ep == '=' && *ap == '\0')
      {
        puts (ep + 1);
        ++matches;
        break;
      }
  }
     }
 }
我开始没想明白,后来想,其逻辑是,如果argv[0] argv[1]
把argv[1]当成环境变量,在全部的环境变量中去找,找到后就打印。但环境变量在environ已经变量
环境变量=值
这种形式了,为此,要把=后的值剔出来,于是就弄这么复杂,我于是在while循环中,把ep当前所指字符打印出来,发现会吃掉一个字符,
我想是
while (*ep != '\0' && *ap != '\0' && *ep++ == *ap++)
  {
 printf("[%c]\n",*ep);
    if (*ep == '=' && *ap == '\0')
      {
        puts (ep + 1);
        ++matches;
        break;
      }
  }
应该是后面++的缘故。
很有意思。而matches来控制,若有环境变量没找到,就显示出错信息。我原来以为有几个环境变量没找到,就显示几。后来发现不管多少个环境变量没找到,退出时,都返回1,因为
 exit_status = (matches != argc - optind);
 exit (exit_status);
哈哈,有意思。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值