C语言 为什么 getlogin() 即使没有控制终端也能成功



我写了一个简单的C程序:

#include <unistd.h>
#include <stdio.h>
int main( int argc, char *argv[] ) {
  printf( "%sn", getlogin() );
  return 0;
}

。尝试一些东西。 我尝试通过确保没有控制终端来使 getlogin() 失败,但它仍然获取登录名并打印它。 最极端的例子来证明这一点:

#!/bin/bash
for i in $(env | grep -vP ^PATH\b | awk -F= {print $1}); do
  unset $i;
done;
(tty; perl -e 'setpgrp; sleep( 1 ); exec( qw( getlogin_test ) );' ) &

解释一下:它取消设置除 PATH 之外的所有环境变量,然后运行一个执行 'tty' 的子 shell,然后是一个 perl 实例;子 shell 是后台的。 调用 setpgrp 以确保它没有使用进程组来查找父级的控制终端(我不相信它这样做,但我把它放在那里以防假设错误)。

在这一点上,我不知所措。 它仍然打印用户名。 我从很多来源看到的一个更简单的例子具有相同的行为:

sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' &'
sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' & wait'

这两个仍然打印用户名,在Solaris 10和Redhat 6下,使用不同版本的perl,bash,sh和tcsh。

关闭或重定向 STDIN 到文件就可以了。

$ perl -wE'say getlogin()'
eric
$ perl -wE'open STDIN, "<", "/dev/null" or die $!; say getlogin()'
Use of uninitialized value in say at -e line 1.

这是一个在 Debian 盒子上自建的 Perl(默认选项)。

最新更新