2014-01-21 20 views

回答

1

你是對的。這是翻譯~,而不是open的外殼。通配符如*?也是如此。事實上,任何時候只要鍵入文件名的磁盤字節以外的任何東西,它就是你的shell爲你翻譯成實際的文件名。

+0

我大致記得fopen()可以處理這樣的路徑名稱,對吧? – Infinite

+1

@SetTimer:不,fopen()也沒有使用shell。 –

1

是的,正好。

代字號是shell路徑名稱擴展的一部分。打開的庫調用不使用shell。

+1

在shell中,'〜/ my.log'與'「$ HOME/my.log」'相同。您可以在C中獲得'HOME'環境變量,並使用它來構建所需的路徑。參見['getenv()'](http://www.cplusplus.com/reference/cstdlib/getenv/)。 – Palec

1

你可以是(如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不解釋或擴展下面的代字號),但沒有人願意做出這樣糟糕的伎倆。