50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
/*
|
|
* Scenario 3: The Syscall Storm - Unbuffered I/O
|
|
* ===============================================
|
|
* This program reads a file byte-by-byte using raw read() syscalls.
|
|
* Each byte triggers a context switch to the kernel - extremely slow!
|
|
*
|
|
* Compile: gcc -O2 -o read_slow read_slow.c
|
|
*
|
|
* EXERCISES:
|
|
* 1. Create a test file: dd if=/dev/urandom of=testfile bs=1M count=1
|
|
* 2. Run: time ./read_slow testfile
|
|
* 3. Profile: strace -c ./read_slow testfile
|
|
* 4. Compare with read_fast.c
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if (argc != 2) {
|
|
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
int fd = open(argv[1], O_RDONLY);
|
|
if (fd < 0) {
|
|
perror("open");
|
|
return 1;
|
|
}
|
|
|
|
char c;
|
|
unsigned long byte_count = 0;
|
|
unsigned long checksum = 0;
|
|
|
|
/* Read one byte at a time - TERRIBLE for performance! */
|
|
while (read(fd, &c, 1) == 1) {
|
|
byte_count++;
|
|
checksum += (unsigned char)c;
|
|
}
|
|
|
|
close(fd);
|
|
|
|
printf("Read %lu bytes\n", byte_count);
|
|
printf("Checksum: %lu\n", checksum);
|
|
|
|
return 0;
|
|
}
|