我知道如果filepath存在,open(filepath, O_WRONLY|O_EXCL)会失败,但是它会返回什么吗?
现在假设我想知道一个文件是否存在,并且想要打印一条消息,如果存在,我是否应该在上面的open()命令中包含O_EXCL标志?
编辑:我想我犯了一个错误,我应该使用open(filepath, O_CREAT|O_EXCL)
发布于 2020-08-30 22:59:19
如果filepath存在,则open(filepath, O_WRONLY|O_EXCL)不会失败;如果它不存在,或者如果您没有写访问权限,它将失败。
O_EXCL只能与O_CREAT一起使用,然后必须传递一个额外的参数来指定要创建的文件的模式位:
int hd = open(filepath, O_WRONLY | O_CREAT | O_EXCL, 0644);在失败的情况下,hd将具有负值,并且将设置errno以指示错误原因。使用perror()报告故障并显示错误消息。
您还可以使用access()测试文件的存在和写访问权限,但它不适合您的用例,因为使用access的测试和对open的调用之间的并发进程可能会创建该文件(以及其他原因)。
发布于 2020-08-30 23:02:29
来自manual的重要说明
通常,如果不使用O_CREAT,则O_EXCL的行为是未定义的。有一个例外:在Linux2.6及更高版本上,如果路径名指向块设备,则可以在不使用O_CREAT的情况下使用O_EXCL。
因此,除非有一个用例,否则您的命令将调用未定义的行为。
发布于 2020-08-30 23:00:47
如果open由于任何原因失败,它将返回-1并设置errno以指明原因。详情请参阅您打开的(2)手册页面。在任何Unixy系统中键入man 2 open。
https://stackoverflow.com/questions/63658733
复制相似问题