ryochack
7/17/2013 - 1:09 PM

open/read vs open/mmap vs fopen/fread on clang

open/read vs open/mmap vs fopen/fread on clang

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

inline int get_fsize(int fd) {
	struct stat sb;
	int err;
	err = fstat(fd, &sb);
	if (err) {
		fprintf(stderr, "fstat error! [%s]\n", strerror(errno));
		return -1;
	}
	return sb.st_size;
}

int main(int argc, char *argv[]) {

	int fd;
	char *path, *addr;
	int i, cnt = 0, err;
	int fsize;

	if (argc < 2) {
		fprintf(stderr, "require file path.\n");
		return -1;
	}
	path = argv[1];

	fd = open(path, O_RDONLY);
	fsize = get_fsize(fd);
	if (fsize < 0) {
		return -1;
	}
	addr = mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0);

	err = madvise(addr, fsize, MADV_SEQUENTIAL | MADV_WILLNEED);
	if (err) {
		fprintf(stderr, "madvise error! [%d]\n", err);
	}

	for (i=0; i<fsize; i++) {
		if (addr[i] == 0x00) cnt++;
	}

	err = munmap(addr, fsize);
	if (err) {
		fprintf(stderr, "munmap error! [%d]\n", err);
	}
	close(fd);

	printf("%s: size=%d cnt=%d\n", path, fsize, cnt);

	return 0;
}