2010-09-08 60 views
0

我正在使用带文件描述符的写入函数写入文本文件,并设置了O_NONBLOCK。Linux写入函数

fd = open(filepath, O_RDWR | O_NONBLOCK , 0777); 
write(fd, string, size); 

的问题,我有如下:

  1. 多大的文件缓存大小,直到它被阻止?

  2. 如果我如上所述使用O_NONBLOCK,如果缓冲区已满,会发生什么情况?该字符串将被丢弃?

  3. 那么对于写O_NONBLOCK,我应该经常检查写入的返回值,看它是否与我们想写的字符串的长度相同?

  4. 如何测试文件写入缓冲区已满的现象?我已经创建了一个任意长的字符串,但似乎仍然无法生成效果字符串放置。

谢谢。

回答

0

写入可能无法完全写入fd的原因有很多。

U可以很容易地在套接字,管道等中模拟阻塞,如果另一端的用户没有从流中读取数据,写入将被阻塞。

如果您用NON_BLOCK打开了fd,那么写入操作会立即写入写入流的字节数。 可以使用此信息重试剩余数据的操作。在任何情况下,都不会放弃“字符串”。

0
  1. 这是故意留下未指定的,你的代码不应该知道或关心。
  2. write()将返回一个小于或等于零的数字,在这种情况下,errno将被设置为EAGAIN。
  3. 当然。然后从最后一次写入()离开的地方重试。
  4. 试着写到标准输出(FD = 1),并通过管道运行您的程序,即

myprogram | (睡眠30;猫)

1

O_NONBLOCK对文件描述符(*)没有影响。通常,缓存中的操作系统已经缓存了write(),OS /文件系统本身决定数据何时应该放入磁盘。 O_NONBLOCK只能用于套接字,fifos和管道。

如果你需要异步文件I/O,你应该检查aio_write()

否则重申,write()已经是异步的,不等待磁盘IO完成除非你使用O_SYNCO_DSYNCO_DIRECT标志。 (*)在Linux下打开()与O_NONBLOCK文件只是一个提示,程序不打算读取或写入文件 - 但只做阻挡层调用ioctl()


Edit1。现实检查我没有做白日梦。 As per POSIXv6

O_NONBLOCK
当打开一个FIFO与O_RDONLY或O_WRONLY设置:
[...跳过...]
当打开一个块特殊或字符特殊文件支持 无阻塞打开:
[...跳过...]
否则,O_NONBLOCK的行为未指定。