Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么getlogin()即使没有控制终端也能成功_C_Perl - Fatal编程技术网

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

C 为什么getlogin()即使没有控制终端也能成功,c,perl,C,Perl,我写了一个简单的C程序: #include <unistd.h> #include <stdio.h> int main( int argc, char *argv[] ) { printf( "%s\n", getlogin() ); return 0; } 在解释方式上:它取消设置除PATH之外的所有环境变量,然后运行一个子shell,执行“tty”,然后运行一个perl实例;子外壳是背景的。调用setpgrp以确保它没有使用进程组来查找父级的控制终端(我

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

#include <unistd.h>
#include <stdio.h>

int main( int argc, char *argv[] ) {
  printf( "%s\n", getlogin() );
  return 0;
}
在解释方式上:它取消设置除PATH之外的所有环境变量,然后运行一个子shell,执行“tty”,然后运行一个perl实例;子外壳是背景的。调用setpgrp以确保它没有使用进程组来查找父级的控制终端(我不相信它会这样做,但我把它放在那里以防假设错误)

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

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

在Solaris10和Redhat6下,这两个版本都使用不同版本的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.
$perl-我们说的是getlogin()
埃里克

$perl-我们正在打开STDIN,“getlogin()不安全,可能正在尽力找出用户名。您的进程仍然有一个控制终端,我不确定您认为哪一步可以摆脱它。@不,我的印象是,把它扔到后台应该可以摆脱控制终端。@Brian Vandenberg不,一点也不。我忘了在post,
tty
打印消息
不是tty
hm。我用perl 5.10.1尝试了这一点:
perl-wE'open(STDIN,“glibc/Linux中的getlogin()在“/proc/self/loginuid中戳来戳去”调用getpwuid_r,它并不真正关心控制终端,除非它失败。这当然可以解释Redhat的结果,但在Solaris中perl没有使用glibc。它只加载socket、nsl、dl、m和c。我希望我能记住我得出的结论,但我不记得。给出的答案,虽然可能没有我所需要的仍然是有帮助的,值得认可。
$ 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.