如果文件不是以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不能打印文件内容的主要内容,如果未能解决你的问题,请参考以下文章

文件操作

Linux_Unix系统编程chapter5 深入探究文件IO

Python-文件操作

C++ 文件读写

文件处理之处理模式及其黑魔法

8.Python初窥门径(文件操作)