首页 > 代码库 > Linux通过AIO进行异步读文件
Linux通过AIO进行异步读文件
下面列出源代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <aio.h>#include <unistd.h>#include <signal.h>#include <sys/stat.h>#include <fcntl.h>static char *memBuffer;static int sFileDesc;static struct sigaction sOldSigAction;static void MySigQuitHandler(int sig){ printf("Signal Quit! The number is: %d\n", sig);}static void MyFileReadCompleteProcedure(int sig, siginfo_t *si, void *ucontext){ printf("The file length is: %zu, and the content is: %s\n", strlen(memBuffer), memBuffer); int status = close(sFileDesc); if(status == 0) puts("File closed successfully!"); else printf("The error code is: %d\n", status); free(memBuffer); // 还原原来的SIGUSR1信号行为 if(sigaction(SIGUSR1, &sOldSigAction, NULL) == -1) puts("SIGUSR1 signal restore failed!");}int main(void){ struct sigaction sigAction = { .sa_flags = SA_RESTART, .sa_handler = &MySigQuitHandler }; sigemptyset(&sigAction.sa_mask); if (sigaction(SIGQUIT, &sigAction, NULL) == -1) { puts("Signal failed!"); return -1; } sigAction.sa_sigaction = &MyFileReadCompleteProcedure; if(sigaction(SIGUSR1, &sigAction, &sOldSigAction) == -1) { puts("Signal failed!"); return -1; } const char *filePath = "myfile.txt"; const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; sFileDesc = open(filePath, O_RDONLY, mode); if(sFileDesc == -1) { printf("The file: %s cannot be opened!\n", filePath); return -1; } const long fileLength = lseek(sFileDesc, 0, SEEK_END); lseek(sFileDesc, 0, SEEK_SET); memBuffer = malloc(fileLength + 1); memBuffer[fileLength] = ‘\0‘; struct aiocb aioBuffer; aioBuffer.aio_fildes = sFileDesc; aioBuffer.aio_offset = 0; aioBuffer.aio_buf = memBuffer; aioBuffer.aio_nbytes = fileLength; aioBuffer.aio_reqprio = 0; aioBuffer.aio_sigevent = (struct sigevent){.sigev_notify = SIGEV_SIGNAL, .sigev_signo = SIGUSR1, .sigev_value.sival_ptr = memBuffer }; aio_read(&aioBuffer); getchar(); return 0;}
其中,上述代码实现中采用SIGUSR1信号进行捕获文件读完成事件,当然,这里也可以用SIGIO信号。
另外,在编译链接时必须添加-lrt命令选项,因为rt库才包含了系统底层的API。
Linux通过AIO进行异步读文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。