如果文件不是以sudo方式打开,系统调用open C不能打印文件内容

     2023-02-23     181

关键词:

【中文标题】如果文件不是以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(),也许你应该在更大的上下文中指定代码。

文件处理(代码片段)

...ata)  强调!!!f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。这样有可能会造成乱码,若要保证不乱码,文件以什么方式... 查看详情

文件操作

...要close关闭open(指定路径-----打开或要创建的文件名):如果不指定,默认是当前路径默认打开方式:mode=‘rt‘以只读和字符的模式打开open(fi 查看详情

php中fopen函数的问题

...方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'w+'读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'a'写入方式打开,将文件指针... 查看详情

streamfilestreammemorystream的区别

...打开或创建的方式CreateNew:指定操作系统应创建新文件,如果文件已经存在,则引发IOException;?Create:指定操作系统应创建新文件,如果文件已经存在,它将被覆盖;?Open:指定操作系统应打开现有文件,如果文件不存在,则引发... 查看详情

php中如何在同一个文件中写入而不覆盖以前写的内容

...方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。      \'w+\'  读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。      \'a\'  写入方式打... 查看详情

如果open的file不close,会有什么样的影响

1.一个进程如果打开了一个文件,不close,程序结束后,操作系统会自动回收释放2.操作系统有最大打开文件的限制,如果超过了打开文件会报错3.如果一个程序大量的读写多个不同的文件,不close,超过max_open_file个数后,打开文件报错4.还... 查看详情

python文件操作详解(代码片段)

...果:thisistest;感觉文件操作太简单了。那么问题来了:如果文件不存在如何创建文件?如何写文件?这种方式能够写入吗?我们来看文件打开方式。2文件打开方式详解:2.1open方法详解:open(file,mode=‘r‘,buffering=-1,encoding=None,erro... 查看详情

文件操作

...t",‘a‘)#追加写4#f=open("temp.txt",‘x‘)#python3新加的方式,如果文件存在则报错,不存在则创建并写5#f=open("temp.txt",‘rb‘)#以byte 查看详情

day3_文件读写

...式打开文件读,用r表示,以读文件的方式打开的时候,如果文件不存在会报错;如果文件存在,而且不需要往文件里写东西的时候,用r打开,只要沾上r,文件不存在的时候就会报错 如f=open(‘a.txt‘),如果a.txt不在当前目录... 查看详情

文件处理总结(代码片段)

...读取文件:     read() 一次性读取(如果文件内容过大,内存会占满)    readlines() 一次性读取按行读取返回是一个列表(如果文件内容过大,内存会占满)  &nb 查看详情

文件读写(代码片段)

...quo;r”表示读,这样,我们就成功的打开了一个文件。如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码蛤详细的信息告诉你文件不存在。>>>f=open("User/michael/test.txt",‘r‘)Tracebak(mostrecentcalllast):file"&... 查看详情

linux磁盘io

...API/系统调用是必不可少的Create函数用来打开一个文件,如果该文件不存在,那么需要在磁盘上创建该文件Open函数用于打开一个指定的文件。如果在Open函数中指定O_CREATE标记,那么Open函数同样可以实现Create函数的功能Close函数用... 查看详情

python教程:io(代码片段)

...示符\'r\'表示读,这样,我们就成功地打开了一个文件。如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>FileNotFoundErr... 查看详情

文件处理之处理模式及其黑魔法(代码片段)

...若不指定,则open函数默认系统的编码,系统的编码就是如果你是windows系统就默认Windows系统的编码文件有打开就有关闭,若只打开不关闭会占用内存f=open(‘文件名‘ 查看详情

文件打开的过程——调用fd=open()时操作系统所做的工作

fd=fopen()是一个系统调用。用于依据文件名称打开一个文件。返回该文件的文件描写叙述符,文件打开后进程便能够依据文件描写叙述符fd进行其它操作,比方读,写,关闭等操作。各个操作系统打开文件的过程是类似的,本文以... 查看详情

day04(代码片段)

...编码是操作系统的默认编码#rwa(r+w+a+避免用)以上6种加b,如果打开模式+b,就不需要指定编码了#编码UTF-8gbk#操作文件#读#read不穿参数意味着读所有#传参,如果是r方式打开的,参数指的是读多少个字符#传参,如果是rb方式打开的... 查看详情

open()(代码片段)

...法对文件进行读写等操作缓冲区的几种设置方法: (1)如果设置为0, (2)如果设置为1, (3)如果设置为大于1, (4)如果设置为负数, 打开模式: 文件对象的方法:         查看详情

16.文件file

...件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出OSError。注意:使用open()方法一定要保证关闭文件对象,即调用close()方法。open()函数常用形式是接收两个参数:文件名(file)和模式(mode)。open... 查看详情