路徑我試着用開放(爲const char *路徑,詮釋oflag中)不接受像 「〜/ my.log」
open("~/my.log", O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
創建一個文件,但它會返回錯誤
"No such file or directory".
是否因爲open()沒有翻譯「〜」?
路徑我試着用開放(爲const char *路徑,詮釋oflag中)不接受像 「〜/ my.log」
open("~/my.log", O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
創建一個文件,但它會返回錯誤
"No such file or directory".
是否因爲open()沒有翻譯「〜」?
你是對的。這是翻譯~
,而不是open
的外殼。通配符如*
和?
也是如此。事實上,任何時候只要鍵入文件名的磁盤字節以外的任何東西,它就是你的shell爲你翻譯成實際的文件名。
是的,正好。
代字號是shell路徑名稱擴展的一部分。打開的庫調用不使用shell。
在shell中,'〜/ my.log'與'「$ HOME/my.log」'相同。您可以在C中獲得'HOME'環境變量,並使用它來構建所需的路徑。參見['getenv()'](http://www.cplusplus.com/reference/cstdlib/getenv/)。 – Palec
你可以是(如Palec評論),構建體(使用snprintf(3)或asprintf(3)與getenv(3),即getenv("HOME")
)所需的路徑,或使用wordexp(3)功能擴展"~/my.log"
到期望的路徑。也glob(3)看到GLOB_TILDE
所以,你可以編寫代碼:
char logpathbuf[256];
snprintf (logpathbuf, sizeof(logpathbuf), "%s/my.log", getenv("HOME"));
int fd = open(logpathbuf, O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd <0) { perror("open logfile"); exit(EXIT_FAILURE); }
只是該代碼可以在缺少HOME
或太長HOME
在您的環境中不太可能的情況下胡作非爲或崩潰。見environ(7)
順便說一句,你可能會openlog(3)和syslog(3)感興趣
你open("~/my.log", O_WRONLY | O_CREAT | O_TRUNC, 0777)
實際上在你有一個準確命名~
目錄不幸的情況下工作;這可能是因爲之前運行了mkdir \~
shell命令(反斜槓要求shell不解釋或擴展下面的代字號),但沒有人願意做出這樣糟糕的伎倆。
我大致記得fopen()可以處理這樣的路徑名稱,對吧? – Infinite
@SetTimer:不,fopen()也沒有使用shell。 –