我尝试使用
open("~/my.log", O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
创建一个文件,但它返回错误
"No such file or directory".
是因为open()不能翻译“〜”吗?
答案 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不解释或扩展以下代字号),但是没有人愿意做出这么糟糕的伎俩。