返回

在Linux下,C++的IO操作(第2部分)

Android

Linux下,C++的IO操作(第2部分)

Linux操作系统提供了丰富的系统调用接口,用于文件和设备的输入输出操作。在上一篇博文中,我们介绍了open/close系统调用以及文件符的概念。在这一篇博文中,我们将继续探讨read/write系统调用,以及阻塞、非阻塞相关的概念以及配置方式,等待超时方式。还将介绍lseek、fcntl、ioctl文件操作相关的系统调用。

read/write系统调用

read/write系统调用用于从文件或设备读取或写入数据。read系统调用从文件或设备中读取数据,并将其存储在用户指定的缓冲区中。write系统调用将数据从用户指定的缓冲区写入文件或设备。

read/write系统调用的原型如下:

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

其中,fd是文件符,buf是用户指定的缓冲区,count是希望读取或写入的数据量。read/write系统调用返回实际读取或写入的数据量。如果发生错误,则返回-1。

阻塞和非阻塞IO

read/write系统调用可以以阻塞或非阻塞的方式运行。阻塞IO意味着如果在调用read/write时没有可读或可写的数据,则调用将阻塞,直到有数据可读或可写为止。非阻塞IO意味着如果在调用read/write时没有可读或可写的数据,则调用将立即返回,并不会阻塞。

要将read/write系统调用设置为非阻塞,可以将O_NONBLOCK标志传递给open系统调用。例如:

int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);

等待超时

对于阻塞IO,如果在调用read/write时没有可读或可写的数据,则调用将阻塞,直到有数据可读或可写为止。但是,有时我们可能希望在一段时间后超时,而不是无限期地等待。

要设置等待超时,可以使用select系统调用。select系统调用可以监视多个文件描述符,并等待其中一个文件描述符变为可读或可写。select系统调用的原型如下:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

其中,nfds是要监视的文件描述符数量,readfds是可读的文件描述符集合,writefds是可写