簡體   English   中英

OCaml:當stdin重定向時,Unix.getlogin出現意外異常

[英]OCaml: unexpected exception with Unix.getlogin when stdin redirected

我在這個簡單的代碼中找到了下一個問題:

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", "")

知道為什么會這樣嗎?

重定向程序的輸入會覆蓋其控制終端。 沒有控制終端,就找不到登錄信息:

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

但是,您仍然可以通過獲取用戶的id( getuid )並查找其passwd條目(相關文檔)getpwuid ),然后在其中查找用戶名來查找用戶名(可能)。

取決於您的應用:

  • 如果你真的不關心“getlogin”返回的值,你可以這樣做:

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

    你可能會得到比getuid更好的東西,因為它也適用於具有Set-User-ID標志(sudo / su)的程序。

  • 如果你真的關心“getlogin”返回的值,即你真的想知道誰登錄了,你應該在getlogin失敗時失敗。 任何其他解決方案只會給出正確結果的近似值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM