面试题答案
一键面试- 初始化
struct aiocb
结构体:#include <aio.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { struct aiocb my_aiocb; // 初始化结构体为0 memset(&my_aiocb, 0, sizeof(struct aiocb)); // 设置文件描述符 int fd = open("test.txt", O_RDONLY); my_aiocb.aio_fildes = fd; // 设置缓冲区地址 char buffer[1024]; my_aiocb.aio_buf = buffer; // 设置要传输的字节数 my_aiocb.aio_nbytes = sizeof(buffer); // 设置偏移量 my_aiocb.aio_offset = 0; // 设置请求的唯一标识符 my_aiocb.aio_lio_opcode = LIO_READ; // 更多设置,例如信号处理相关等 // my_aiocb.aio_sigevent.sigev_notify = SIGEV_NONE; // 执行异步I/O操作,例如aio_read(&my_aiocb); close(fd); return 0; }
- 关键成员作用:
aio_fildes
:文件描述符,指定要进行异步I/O操作的文件或设备。通过open
函数获取,例如上述代码中open("test.txt", O_RDONLY)
获取到的fd
赋值给aio_fildes
,它告诉系统对哪个文件进行读写等I/O操作。aio_buf
:指向缓冲区的指针,用于存储从文件读取的数据或者要写入文件的数据。如代码中定义的char buffer[1024];
并将其地址赋值给aio_buf
,I/O操作的数据就会在这个缓冲区和文件之间传输。aio_nbytes
:指定要传输的字节数。这里设置为sizeof(buffer)
,表示要读取或写入的字节数量。它决定了一次I/O操作的数据量。aio_offset
:文件偏移量,指定I/O操作在文件中的起始位置。设置为0表示从文件开头开始操作,如果设置为其他值,可以在文件的指定位置进行读写,而不必从文件开头顺序操作。aio_lio_opcode
:指定I/O操作类型,如LIO_READ
表示读操作,LIO_WRITE
表示写操作等。不同的操作码决定了具体的异步I/O行为。aio_sigevent
(可选但重要):与信号通知相关的结构体。可以设置当异步I/O操作完成时如何通知应用程序,例如设置aio_sigevent.sigev_notify = SIGEV_NONE
表示不使用信号通知,还可以设置为SIGEV_SIGNAL
使用信号通知等不同方式。