设为首页 加入收藏

TOP

Linux通过AIO进行异步读文件
2015-12-15 23:09:04 来源: 作者: 【 】 浏览:2
Tags:Linux 通过 AIO 进行 异步 文件

Linux通过AIO进行异步读文件,下面列出源代码:


#include
#include
#include


#include
#include
#include
#include
#include



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。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇浅谈现代编程语言语法与标准库紧.. 下一篇C11中的Unicode

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: