Home > 雑談 > Re: ファイルをコピーするプログラム

Re: ファイルをコピーするプログラム

  • 2006-12-13 (水) 3:51
  • 雑談

mixiのトピで書いたプログラムのメモ.
http://mixi.jp/view_bbs.pl?id=13304077&comment_cou…

荒れに荒れたトピックの中で空気を読まずに書いたファイルコピーのコード.
手元で確認した限りの最速.

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define nonfatal(s) 
	do { 
		fprintf(stderr, “%s(%d): “, __FILE__, __LINE__); 
		perror(s); 
		return EXIT_FAILURE; 
	} while (0)

int main(void)
{
	int in, out;
	char *in_data, *out_data, *endp;
	ssize_t in_len;
	struct stat st;

	in = open(”infile”, O_RDONLY, 0666);
	if (in < 0) nonfatal("open(in)");

	if (fstat(in, &st) < 0) nonfatal("fstat");

	in_len = st.st_size;

	in_data = mmap(NULL, in_len, PROT_READ, MAP_PRIVATE, in, 0);
	if (in_data == MAP_FAILED) nonfatal("mmap(in)");

	out = open("outfile", O_RDWR | O_CREAT | O_TRUNC, 0666);
	if (out < 0) nonfatal("open(out)");

	if (lseek(out, in_len - sizeof(int), SEEK_SET) < 0) nonfatal("lseek");
	if (write(out, &out, sizeof(int)) < 0) nonfatal("write");

	out_data = mmap(NULL, in_len, PROT_WRITE, MAP_SHARED, out, 0);
	if (out_data == MAP_FAILED) nonfatal("mmap(out)");

	endp = in_data + (sizeof(int) - (size_t)in_data % sizeof(int)) % sizeof(int);
	while (in_data != endp) {
		*out_data++ = *in_data++;
		in_len--;
	}

	endp = in_data + in_len - in_len % sizeof(int);
	while (in_data != endp) {
		*(int *)out_data = *(int *)in_data;
		out_data += sizeof(int);
		in_data += sizeof(int);
	}

	endp = in_data + in_len % sizeof(int);
	while (in_data != endp) *out_data++ = *in_data++;

	if (msync(out_data, st.st_size, MS_SYNC)) nonfatal("msync");

	return EXIT_SUCCESS;
}

Comments:0

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://blog.takfjt.net/archives/140/trackback
Listed below are links to weblogs that reference
Re: ファイルをコピーするプログラム from takfjt’s blog

Home > 雑談 > Re: ファイルをコピーするプログラム

Search
Feeds
Meta

Page Top