如果文件不是以sudo方式打开,系统调用open C不能打印文件内容
Posted
技术标签:
【中文标题】如果文件不是以sudo方式打开,系统调用open C不能打印文件内容【英文标题】:System call open C can't print file content if the file is not opened as sudo 【发布时间】:2018-04-30 02:11:02 【问题描述】:所以我创建了一个新文件:
fd = open("tester.txt", O_CREAT | O_RDWR);
然后使用系统调用 write 我添加一些信息。但是当我尝试从文件中读取信息时,它无法制作。使用 终端 我发现打开文件的唯一方法是使用 sudo 并且 内容已成功写入。但是,我的程序不能是 root。那么,我如何打开文件,向其中写入一些内容,而不关闭 C 程序输出文件。
【问题讨论】:
您究竟是如何发现需要使用 sudo 的?您具体发现了什么来得出这个结论? cat 文件名不打开文件但 sudo cat 文件名可以 @KarinaK 因为你首先在未经许可的情况下创建了文件,现在使用 rm 命令手动删除文件,然后再次执行你的程序 【参考方案1】:当你在 open() 系统调用中使用 O_CREAT 标志时,你应该明确地提供权限。 open() 的手册页说
int open(const char *pathname, int flags, mode_t mode);
mode 指定在创建新文件时使用的权限。当 O_CREAT 在标志中指定时,必须提供此参数;如果未指定 O_CREAT,则模式被忽略。
所以将上面的行修改为
fd = open("tester.txt", O_CREAT | O_RDWR, 0664 );
我希望它能消除你的疑虑。
【讨论】:
谢谢,我会接受另一个答案,因为 Karim 是第一个。 是的 @KarinaK 欢迎您,只是迟到了 5 分钟!我刚刚下班过来【参考方案2】:您没有将文件模式指定为创建打开调用的第三个参数;尝试以下方法:
fd = open("tester.txt", O_CREAT | O_RDWR, 0644);
然后,该文件应该以-rw-r--r--
模式创建,以便您自己的用户可以打开它进行读写。否则,它可能最终会获得一些随机权限,即---------
,并且只有 root 可以打开它进行阅读(至少无需对其进行 chmod)。
【讨论】:
我收到以下错误:tail: error writing 'standard output': Bad address @KarinaK 现在,tail
在哪里发挥作用?
只是错误中的文本,错误本身是错误地址
这意味着 OP 没有包含 open
的原型??
@KarinaK 我没有看到上面的 perror(),也许你应该在更大的上下文中指定代码。以上是关于如果文件不是以sudo方式打开,系统调用open C不能打印文件内容的主要内容,如果未能解决你的问题,请参考以下文章