/* * I need a small program to write in various mode. */ #include #include #include #include #include #include int main(int argc, char *argv[]) { int size, cnt; char *buf; char *fn; int fid, i; struct timeval tv1, tv2, ttv1, ttv2; double x; int sync = 1; int timing = 0; unsigned long *t; if (argc < 4) { printf("%s [s/a [t]]\n", argv[0]); exit(1); } fn = argv[1]; size = atoi(argv[2]); cnt = atoi(argv[3]); if ((argc >=5) && (argv[4][0] == 'a')) sync = 0; if ((argc >=6) && (argv[5][0] == 't')) timing = 1; if (timing) { t = (unsigned long *)malloc(sizeof(double) * cnt); if (!t) { printf("fail to get mem for t\n"); exit(1); } } buf = malloc(size * sizeof(char)); if (!buf) { printf("fail to get memory\n"); exit(1); } fid = open(fn, O_CREAT|O_WRONLY|(sync ? O_SYNC : 0), S_IRWXU); if (fid == -1) { printf("open file fail\n"); exit(1); } gettimeofday(&tv1, NULL); for (i = 0; i < cnt; i++) { if (timing) { gettimeofday(&ttv1, NULL); write(fid, buf, size); gettimeofday(&ttv2, NULL); t[i] = (ttv2.tv_sec - ttv1.tv_sec) * 1000000 + ttv2.tv_usec - ttv1.tv_usec; } else write(fid, buf, size); } close(fid); gettimeofday(&tv2, NULL); x = (tv2.tv_sec - tv1.tv_sec) + ((double)(tv2.tv_usec - tv1.tv_usec)) * 0.000001; x = ((double)(size * cnt) / 1048576.0) / x; printf("%8dBytes * %8d :%10.3fMB/s\n", size, cnt, x); if (timing) { for (i = 0; i < cnt; i++) { printf("%8ld", t[i]); if (!(i % 10)) printf("\n"); } printf("\n"); } }