c - 如何在 unix 中创建阻塞文件描述符?

标签 c file unix blocking

我想在 Unix 的 C 中创建阻塞和非阻塞文件。首先,阻塞:

fd = open("file.txt", O_CREAT | O_WRONLY | O_EXCL);

是吗?我不应该添加一些模式选项,例如 0666 吗?

非阻塞文件怎么样?我对此一无所知。

我想实现这样的目标:

  1. 当我打开它进行写入时,它打开进行写入,没问题;如果不是,它会阻塞。
  2. 当我打开它阅读时,它已经打开阅读,没问题;如果不是,它会阻塞。

最佳答案

文件描述符是阻塞的还是非阻塞的;文件不是。如果您需要非阻塞文件描述符,请将 O_NBLOCK 添加到 open() 调用中的选项。

请注意,打开 FIFO 进行读取或写入将阻塞,除非有进程打开 FIFO 进行其他操作,或者您指定了 O_NBLOCK。如果您打开它进行读写,open() 是非阻塞的(将立即返回); I/O 操作仍然由您是否设置 O_NBLOCK 控制。

更新后的问题不清楚。但是,如果您正在寻找“对文件的独占访问权”(以便其他人无法打开它),那么 O_EXCL 和 O_NBLOCK 都不是答案。 O_EXCL 影响创建文件时发生的情况;如果文件已经存在,创建将失败。 O_NBLOCK 影响 read() 操作在没有数据可供读取时是否会阻塞。如果您阅读 POSIX open()描述,那里没有任何东西允许您请求对文件的“独占访问”。

要回答有关文件模式的问题:如果包含 O_CREAT,则需要 open() 的第三个参数。如果省略 O_CREAT,则不需要 open() 的第三个参数。这是一个可变参数函数:

int open(const char *filename, int options, ...);

关于c - 如何在 unix 中创建阻塞文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497911/

相关文章:

c - 结构中的双指针

c - 如何使用 pthread 并发操作数据?

file - Maven 使用相同版本的新文件进行更新

bash - 远程sudo,执行命令并将输出写入本地终端

c++ - 发送USR2信号后忽略信号处理程序

c - 字符串处理 C linux 和 windows

c - 哈希表覆盖

android - IIS 托管文件已完成下载 66%

c - 在 C 中查找并替换

linux - 分配给用户的主要组ID可以与用户ID相同吗?