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

时间:2012-03-20 17:33:55

标签: unix ocaml

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

let () =
    print_endline "Hello";
    print_endline (Unix.getlogin ())

在正常情况下,使用./a.out运行:

Hello
ricardo

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

Hello
Fatal error: exception Unix.Unix_error(20, "getlogin", "")

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:5)

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

$ tty
/dev/pts/2
$ tty < /dev/null
not a tty

但是,您仍然可以通过获取用户的ID(getuid)并查找他的passwd entry (related docs)getpwuid)来查找用户名(可能),然后在它

答案 1 :(得分:3)

取决于您的申请:

  • 如果你真的不关心“getlogin”返回的值,你可以这样做:

    try
      Unix.getlogin ()
    with _ -> Sys.getenv "USER"
    

    你可能会得到比getuid更好的东西,因为它也适用于具有Set-User-ID标志(sudo / su)的程序。

  • 如果你真的关心“getlogin”返回的值,即你真的想知道谁登录了,你应该在getlogin失败时失败。任何其他解决方案只会给出正确结果的近似值。