什么';s在C中打开文件函数中标志和模式之间的连接

什么';s在C中打开文件函数中标志和模式之间的连接,c,io,C,Io,我是C的初学者,对C中打开文件函数中的标志和模式参数有疑问 所以C的开放函数是: int open(char *filename, int flags, mode_t mode); 标志的一些宏是: O_RDONLY:只读 O_WRONLY:仅写 O_RDWR:读写 模式位类似于: 我不明白的是, 假设我们有一个开放函数: fd = Open("foo.txt", O_RDONLY, S_IWOTH); 因此,O_RDONLY指定我们只能读取文件,但是S_IWOTH指定任何人都可以写入

我是C的初学者,对C中打开文件函数中的标志和模式参数有疑问 所以C的开放函数是:

int open(char *filename, int flags, mode_t mode);
标志的一些宏是:

  • O_RDONLY
    :只读
  • O_WRONLY
    :仅写
  • O_RDWR
    :读写
模式位类似于:

我不明白的是, 假设我们有一个开放函数:

fd = Open("foo.txt", O_RDONLY, S_IWOTH);
因此,
O_RDONLY
指定我们只能读取文件,但是
S_IWOTH
指定任何人都可以写入此文件,不是因为它们相互矛盾吗?

标志决定了此时打开此文件时要应用的属性(我们称之为“会话”)-这会影响您在文件打开时可以对其执行的操作(或者更准确地说,您可以对文件描述符执行的操作)

模式决定了文件的属性,如果文件是作为打开过程的一部分创建的-这会影响任何人将来打开文件的方式

您的具体示例(尽管使用了正确的
open
而不是
open
):

因为没有
O_CREAT
标志(a)就无法创建文件,所以它实际上并不相关

但是,如果您提供了
O_create
,则完全可以创建允许任何人对其进行写入的文件,但以只读模式为此会话打开该文件



(a) 某些系统具有其他标志,在某些情况下可能会创建文件。例如,Linux有
O\u TMPFILE
标志。

谢谢您的回答。还是一个问题,假设我首先创建一个文件fd=open(“foo.txt”,O_CREAT | O_RDONLY,S_IWUSR);然后另一个应用程序尝试打开这个文件fd=open(“foo.txt”,O_RDWR,0);应用程序可以写入此文件吗?因为它已经被重置为读写,但是所有者(我)只想自己写文件?@paxdiabio,它是一个重载的打开函数,只需要两个参数吗?因为当一个应用程序试图访问一个现有的文件时,没有设置模式位的点,而且,不,它在C++意义上没有超载,因为它基本上只是C,没有运行时重载。只是您可以不使用参数,而将其设置为任意值。除非通过指定某种类型的创建标志来使用它,否则这并不重要。因为这违反了合同,所以在这种情况下,所有赌注都是无效的:-)很可能,您会得到一些“随机”模式。@amjad:是的,假设“其他”是指不同的用户,而不是同一用户的另一个进程。同一用户将能够读取该文件。而且,只是技术上的问题,不是其他用户无法读取文件,而是他们无法打开文件。请注意,这是一个可变函数(
int open(const char*path,int of lag,…);
)。如果不使用模式,那么在没有模式参数的情况下调用它是完全可以接受的。答案提到了O_TMPFILE;这不是POSIX的一部分-您需要阅读相应的手册页()。由于由
O_-TMPFILE
创建的文件是匿名的(指定的路径是目录名,而不是文件名),因此模式与该选项无关(使用
O_-RDWR
)。次要挑剔:签名应该是
int-open(const-char*filename,int-flags,mode)
fd = open("foo.txt", O_RDONLY, S_IWOTH);