我写了一个简单的C程序:
#include <unistd.h>
#include <stdio.h>
int main( int argc, char *argv[] ) {
printf( "%s\n", 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实例;子外壳是背景的。调用 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。