open(const char * path,int oflag)不接受“〜/ my.log”这样的路径

时间:2014-01-21 22:46:55

标签: linux io posix

我尝试使用

open("~/my.log",  O_WRONLY | O_CREAT | O_TRUNC,
        S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 

创建一个文件,但它返回错误

"No such file or directory". 

是因为open()不能翻译“〜”吗?

3 个答案:

答案 0 :(得分:1)

你是对的。它是翻译~而不是open的shell。对于*?等通配符也是如此。事实上,任何时候你可以输入除了文件名的磁盘上的字节以外的任何东西,你的shell就是为你翻译成一个实际的文件名。

答案 1 :(得分:1)

是的,确实。

代字号是shell路径名称扩展的一部分。打开的库调用不使用shell。

答案 2 :(得分: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)

BTW,您可能会对openlog(3)syslog(3)

感兴趣

您的open("~/my.log", O_WRONLY | O_CREAT | O_TRUNC, 0777)实际上会在您有一个名为~的目录的不幸情况下工作;这可以通过以前运行mkdir \~ shell命令来实现(反斜杠要求shell不解释或扩展以下代字号),但是没有人愿意做出这么糟糕的伎俩。