关闭

同步与异步write的效率比较

561人阅读 评论(0) 收藏 举报
分类:

要求:

timewrite  <f1 f2         :表示输出文件f2不用O_SYNC 打开。
timewrite  f1  sync <f2   :表示输出文件f1用O_SYNC 打开。

#include<fcntl.h>
#include<stdio.h>
#include<time.h>
#include <errno.h> 
#define BUFFER_SIZE 1024

int main(char *argc,char *argv)
{
	int from_fd;
	int to_fd;
	int bytes_read, bytes_write;  
	char buffer[BUFFER_SIZE];  
	char *ptr;
	if((from_fd = open("../EMC/net_traffic.dat", O_RDONLY | O_SYNC))==-1)
	{
		printf("open error!\n");
		return 0;
	}
	  
	if((to_fd = open("destination.txt", O_RDONLY | O_WRONLY | O_CREAT ))==-1)
	{       
		        printf("destination file open error!\n");
			        return 0;
	}
	int seconds = time((time_t*)NULL);
	
	 /* 以下代码是一个经典的拷贝文件的代码 */  
    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) {  
            //printf("11");
		    /* 一个致命的错误发生了 */  
        if ((bytes_read == -1) && (errno != EINTR)) break;  
        else if (bytes_read > 0) {  
	            ptr = buffer;  
	                while (bytes_write = write(to_fd, ptr, bytes_read)) {  
		                    /* 一个致命错误发生了 */  
		                if ((bytes_write == -1) && (errno != EINTR))break;  
		                    /* 写完了所有读的字节 */  
		                else if (bytes_write == bytes_read) break;  
		                    /* 只写了一部分,继续写 */  
		                else if (bytes_write > 0) {  
			                    ptr += bytes_write;  
			                        bytes_read -= bytes_write;  
			                    }  
	            }  
            /* 写的时候发生的致命错误 */  
            if (bytes_write == -1)break;  
        }  
    }  
    int seconds1 = time((time_t*)NULL);
    printf("----------------------DMA %d\n",seconds1 - seconds);
    
    close(from_fd);
    close(to_fd);
if((from_fd = open("../EMC/net_traffic.dat", O_RDONLY ))==-1)
	{
		printf("open error!\n");
		return 0;
	}
seconds = time((time_t*)NULL);
	 /* 以下代码是一个经典的拷贝文件的代码 */  
    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) {  
            //printf("11");
		    /* 一个致命的错误发生了 */  
        if ((bytes_read == -1) && (errno != EINTR)) break;  
        else if (bytes_read > 0) {  
	            ptr = buffer;  
	                while (bytes_write = write(to_fd, ptr, bytes_read)) {  
		                    /* 一个致命错误发生了 */  
		                if ((bytes_write == -1) && (errno != EINTR))break;  
		                    /* 写完了所有读的字节 */  
		                else if (bytes_write == bytes_read) break;  
		                    /* 只写了一部分,继续写 */  
		                else if (bytes_write > 0) {  
			                    ptr += bytes_write;  
			                        bytes_read -= bytes_write;  
			                    }  
	            }  
            /* 写的时候发生的致命错误 */  
            if (bytes_write == -1)break;  
        }  
    }  
    seconds1 = time((time_t*)NULL);
    printf("-------------------DIRECTION %d\n",seconds1 - seconds);
    close(from_fd);  
    close(to_fd);      
  return 1; 
}
<pre name="code" class="cpp">运行结果:
----------------------DMA 3
-------------------DIRECTION 0
note:文件名 net_traffic.dat 文件大小 2662423113




Reference:
vim快捷键:http://blog.csdn.net/donahue_ldz/article/details/17139361http://lveyo.iteye.com/blog/240578
linux下GCC编译C程序(一):http://lveyo.iteye.com/blog/240578
linux c学习笔记-文件的创建与读写(open,read,write):http://lobert.iteye.com/blog/1705861
C语言time()函数:获取当前时间(以秒数表示):http://c.biancheng.net/cpp/html/147.html

结果参考:http://www.cnblogs.com/suzhou/p/5381738.html

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:89775次
    • 积分:1486
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:95篇
    • 译文:0篇
    • 评论:24条
    最新评论