[英]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.