系统调用openc can';如果文件未按sudo方式打开,则不打印文件内容

系统调用openc can';如果文件未按sudo方式打开,则不打印文件内容,c,file,operating-system,root,system-calls,C,File,Operating System,Root,System Calls,因此,我创建了一个新文件: fd = open("tester.txt", O_CREAT | O_RDWR); 然后使用系统调用write向其中添加一些信息。但是,当我试图从文件中读取信息时,它无法生成。使用终端我发现,打开文件的唯一方法是使用sudo,并且内容被成功写入。但是,我的程序不能是root。那么,我如何打开文件,向其中写入一些内容,而不关闭C程序输出文件呢 无法将文件模式指定为创建打开调用的第三个参数;请尝试以下操作: fd = open("tester.txt", O_CRE

因此,我创建了一个新文件:

 fd = open("tester.txt", O_CREAT | O_RDWR);

然后使用系统调用write向其中添加一些信息。但是,当我试图从文件中读取信息时,它无法生成。使用终端我发现,打开文件的唯一方法是使用sudo,并且内容被成功写入。但是,我的程序不能是root。那么,我如何打开文件,向其中写入一些内容,而不关闭C程序输出文件呢

无法将文件模式指定为创建打开调用的第三个参数;请尝试以下操作:

fd = open("tester.txt", O_CREAT | O_RDWR, 0644);

然后,应该使用模式
-rw-r--r--
创建文件,以便您自己的用户可以打开它进行读写。否则,它可能会得到一些随机权限,例如,
-----------
,并且只有root用户可以打开它进行读取(至少不需要对其进行chmoded)。

无论何时在open()系统调用中使用O_create flag,都应该显式提供该权限。open()的手册页显示

模式指定在创建新文件时使用的权限。当标志中指定了O_create时,必须提供此参数;如果未指定O_create,则忽略模式

因此,将上述行修改为

  fd = open("tester.txt", O_CREAT | O_RDWR, 0664 ); 

我希望它能消除您的疑虑。

您是如何发现需要使用sudo的?您具体发现了什么来得出这个结论?cat filename并没有打开文件,而是sudo cat filenamedoes@KarinaK因为首先您未经许可就对文件进行了装箱,现在使用rm命令手动删除了文件,然后再次执行程序,因此出现以下错误:tail:写入“标准输出”时出错:错误address@KarinaK现在,
tail
在哪里发挥作用?只是来自perror的文本,错误本身是错误地址这意味着OP没有包含
open
的原型?@KarinaK我没有看到上面的perror(),也许你应该在更大的上下文中指定代码。谢谢,我会接受另一个答案,因为卡里姆是第一个。是的@KarinaK欢迎你,只晚了5分钟!!我刚下班回来
  fd = open("tester.txt", O_CREAT | O_RDWR, 0664 );