免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13807 | 回复: 12
打印 上一主题 下一主题

怎么实现异步文件的读写啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-05 13:29 |只看该作者 |倒序浏览
11可用积分
我看open的man里说O_NONBLOCK标识可以实现非阻塞方式,这样read和write应该可以立即返回吧,但是我写了一个测试程序却不行。


这是代码:
这是代码:

C/C++ code
        int f;
        char *d;
        size_t s = 1024 * 1024 * 1024; // 写入的文件大小是1GB


        f = open( "/tmp/big_test", O_RDWR|O_NONBLOCK|O_CREAT|O_TRUNC, 0777 ); // 用非阻塞方式打开文件

        if( f == -1 ) { perror( "open error" ); return -1; }

        if( fcntl( f, F_SETFL, O_NONBLOCK ) != 0 ) { perror( "fcntl error" ); return -1; }

        d = malloc( s );
        if( d == NULL ) { perror( "malloc error" ); return -1; }

        printf( "start write time=%d\n", time(0) );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( write( f, d, s) < 0 ) perror( "write error" ); // 这里write并没有立即返回

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "end write time=%d\n", time(0) );



最佳答案

查看完整内容

异步读写是用aio_read, aio_write来做的, 你此时设置这个NONBLOCK只是说是非阻塞模式. 而非阻塞模式则是指当前如果不能马上进行读写的话就返回. 比如在网络传输时的read, 如果没有数据可读就不阻塞而返回. 但是读写过程仍然会花时间的. 楼主可以看看第六章的那几种I/O模式.

论坛徽章:
0
2 [报告]
发表于 2007-12-05 13:29 |只看该作者
异步读写是用aio_read, aio_write来做的, 你此时设置这个NONBLOCK只是说是非阻塞模式. 而非阻塞模式则是指当前如果不能马上进行读写的话就返回. 比如在网络传输时的read, 如果没有数据可读就不阻塞而返回. 但是读写过程仍然会花时间的.
楼主可以看看<UNIX网络编程>第六章的那几种I/O模式.

论坛徽章:
0
3 [报告]
发表于 2007-12-05 14:40 |只看该作者

你有多少内存?

......内核去哪找1GB的内存来做缓存啊,把文件大小该成10MB试试

论坛徽章:
0
4 [报告]
发表于 2007-12-05 15:57 |只看该作者
原帖由 Enrique_yu 于 2007-12-5 14:40 发表
......内核去哪找1GB的内存来做缓存啊,把文件大小该成10MB试试


怎么就不能有1g的缓存,我的程序并没有出错,只是write用了8秒才返回,也就是说用的还是阻塞模式,O_NONBLOCK这个标识并没有起作用。

论坛徽章:
0
5 [报告]
发表于 2007-12-05 18:33 |只看该作者
原帖由 scutan 于 2007-12-5 16:42 发表
异步读写是用aio_read, aio_write来做的, 你此时设置这个NONBLOCK只是说是非阻塞模式. 而非阻塞模式则是指当前如果不能马上进行读写的话就返回. 比如在网络传输时的read, 如果没有数据可读就不阻塞而返回. 但是 ...


你的意思就是非阻塞模对于文件操作时没有用的了,对吧?

论坛徽章:
0
6 [报告]
发表于 2007-12-05 18:49 |只看该作者
嗯. 一般情况下是这样的, 对于普通的文件操作一般不使用非阻塞模式.
APUE2上面写到:

O_NONBLOCK
If the pathname refers to a FIFO, a block special file, or a character special file, this option sets the nonblocking mode for both the opening of the file and subsequent I/O.


如果你不想等待, 你可以使用多线程或多进程的方式来进行写, fork一个子进程让其去完成写的操作, 你父进程继续往后面进行.

论坛徽章:
0
7 [报告]
发表于 2007-12-06 08:55 |只看该作者
看来O_NONBLOCK和Windows下面的FILE_FLAG_OVERLAPPED不太一样啊,我对linux编程不是很熟,多谢大虾指导了!

论坛徽章:
0
8 [报告]
发表于 2007-12-06 11:56 |只看该作者
http://www.ibm.com/developerworks/cn/linux/l-async/
楼主看看这个, 比较不错.

论坛徽章:
0
9 [报告]
发表于 2007-12-06 14:58 |只看该作者
原帖由 leehq 于 2007-12-5 15:57 发表


怎么就不能有1g的缓存,我的程序并没有出错,只是write用了8秒才返回,也就是说用的还是阻塞模式,O_NONBLOCK这个标识并没有起作用。

看来你理解错了我的意思,我所说的缓存是内核用来做I/O的Page Cache,普通文件的写操作默认就是异步的,简单的说,假如你要往硬盘写4K的数据,内核会先把数据缓存起来,然后write就返回,实际的写硬盘操作由内核在以后的时间内完成。LZ希望能够不阻塞,说白了要的不就是这个效果么?但是你要保证内核有那么多内存来用做Page Cache。如果没有,那肯定就会阻塞,难不成write直接返回个-1给你?

论坛徽章:
0
10 [报告]
发表于 2007-12-08 14:11 |只看该作者
Enrique_yu

windows下的ReadFile和WriteFile函数在操作文件时能立即返回,所以我以为linux下的read和write也有类似的功能···
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP