OCaml:当stdin重定向时,Unix.getlogin出现意外异常

Ric*_*rdo 6 unix ocaml

我在这个简单的代码中找到了下一个问题:

let () =
    print_endline "Hello";
    print_endline (Unix.getlogin ())
Run Code Online (Sandbox Code Playgroud)

在正常情况下运行,./a.out给出:

Hello
ricardo
Run Code Online (Sandbox Code Playgroud)

但是运行./a.out </dev/null会使Unix.getlogin失败:

Hello
Fatal error: exception Unix.Unix_error(20, "getlogin", "")
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

bkc*_*rad 5

重定向程序的输入会覆盖其控制终端.没有控制终端,就找不到登录信息:

$ tty
/dev/pts/2
$ tty < /dev/null
not a tty
Run Code Online (Sandbox Code Playgroud)

但是,您仍然可以通过获取用户的id(getuid)并查找其passwd条目(相关文档)(getpwuid),然后在其中查找用户名来查找用户名(可能).