Skip to content

Commit 233e96d

Browse files
vagrantvagrant
vagrant
authored and
vagrant
committed
lecture
1 parent dade55e commit 233e96d

File tree

7 files changed

+220
-1
lines changed

7 files changed

+220
-1
lines changed

storage4/stdio.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ int main(int argc, char *argv[]) {
2929
// We're going to open a file for writing and
3030
// loop writing our buffer to it (via stdio),
3131
// sleeping between each write.
32-
fp = fopen(datafile, "w+");
32+
fp = fopen(datafile, "a+");
3333
if (fp == NULL) {
3434
perror("fopen");
3535
exit(1);

storage5/GNUmakefile

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
PROGRAMS = stdio syscall mmap
2+
3+
all: $(PROGRAMS)
4+
5+
include ../common/rules.mk
6+
7+
%.o: %.c $(BUILDSTAMP)
8+
$(CC) $(CPPFLAGS) $(CFLAGS) $(DEPCFLAGS) $(O) -o $@ -c $<
9+
10+
%: %.o
11+
$(CC) $(CFLAGS) -o $@ $^
12+
13+
clean:
14+
rm -f *.o $(PROGRAMS) *.out
15+
rm -rf $(DEPSDIR) *.dSYM
16+
17+
.PHONY: all clean

storage5/data.in

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
AAABBBBABABBAAABABBBBBBBBABAABABAABBABBAABBAABBAABBABBAAAABBBAAAABAAAABBBBBBABBABBABBAABAABAAABAABBBBAAABAABAAAABABAAAABBBABBBBBBABBABABAAABABBBBAAABBBBBBBBABBABBBABBAAABAABABAAAABAAAABABBBABAAABBBBBAAABABAAAAAAAABBBBBABBBAABBABBABBAABBBAABBAAAABABAABAABBABBBABBAAAAABABAAAAABBAABBBAAAAABAAABABAABBBABABBBAABBAABBBAAABAAABAAABBBBABBBABAAABAABBBAABAABBABAABABBBBBBABAAABBBAABABABAAABBABBAAAABBAABBAAAABAABAAAABBBBBABBBBBBAABAAABAAAABAAABABAABAAAAABABBABAABBBBABABAAABBBAAABAAABABABBBBAAAAABAABBBAABABABAABBBAAAAABBAABAAABAAABAAABAABAAABAABAABAABAAABBBBBABBAAAABABAAAAABAAAABAAAAABBBAAABBBAABBBBAABABBABABBBBBBBABABAABBBABBBBABABBBAABAABBABABABABBAABABABBBAABABBAABAABAAABABBABBAABABBAAAABAAAAAAAABAAABBABABBBABAABAAABABAABBBBABBAAAAAAAAAAABBABBBBAAAABABABAAABBABBAABAABAABAABBAAAAAAAABBABBBBABBAABBABAABAAABBAAABBABBABBBBABABBBABAAABABAAABAABBBBABBAAABBABBABBAABAAAAABAABABAAAAAABAABABBABBBBAABAAABBABBABBABBABBABBABBABAABBAABAABBABAABABAABBBABAAAABABBABABABABABBABBBBBABBBBBBAABABBABBBAAABBABBAABAAAABBAABBAABBBBABABABBBAAAAABABAAAABAAAABAAAABABAAAAAABBBBABBAABBBBBBABABAAABABBABBAAAAABAAAABABBBBABAAABAAABABBBBBABAAAAAAABABBABABBBAABAAAABABABBBAABABBBAAABAAAABBBBABBBBABBBBBBABAAAAABABAABABBABAABABABAAAABBABABBBAABBAAABAAABBABBBBABABAAABBABAABBABABAAABBAAAABBBBABBBABABAAABAABBBBBBAAAAAAABBBABBBABBBABAAAABBABABABABAABBABABAABAAAABAABAABBABBBABBBBBBBBAABBBBBBBBAAABBBAABAAABAAABBAAAABBBAABAABAABBBBBAAAAAAAABBBBBBAABAAAABBABABBBABABAAAAABABAABBAAABBBBBABBABBBABABBBBBABABBBAAABAAABAABAABABAABAABABAABBBBAAAAABBABAAAAAABAABBABBBAAABAAAAAAABBBABBAABBAABAAAABBABBBABBBBAAAABAABAABABBBBBAABBBBBBBAABBBAABAABBABBABBAABAAAAAAAABBAABBBABAAABABBAABBBABBABAAABBBAAAAAAABABBAABBBBAAAABBABAAABBABABBAAABAABABABAAAABABBBAABAABABBABABAAAABBBBAAABABAAABBBABBBBABAABBBABAABAABABBBAAAAABABABAABAAAABBBABBAAABAABABBBBBBBABABBBAAABABAABBABBBABABBBAAAABBAABABBBABABAABAAABABAABAABABAABBAABBABAAAAAABABAABBBABBBBBABAABBABBAABABBAABABAABAABABBBBABBBBBBAABBBBBABABABBBABBABBABAABABABBAABABBBABBABABBABAAAAAAABBBBABABAABBAABAABBBBAABBAAAABBBBAABAABAABBAAABBAABBAABBAAAABABAABBABABBBABBABBBAAAABAABAABABBABBBAABBAABBABABAAABABAABBABABBBABBABBABBAABAAAABBAABBBAABBABBABBABABABAABABABBABABBBAABABAABABAABBBABABABABBBBAAABBABBBABBBABABABBBBBBBBBABABAAABABBABAAABABBBAAABBAAAAAABABBBBBAAAAAAAABABBBBAABAABABBBBBBABAABAABBBBBBBABBBBAAAABABABBABABABBAAAAABABBABBBABABAAAAABBAABABBBBBBABBAABABBABBAABAAAABBBABBBAABBAAABBBBAAAAABABBAAABABBABBBAAAAABAABAABABBABABBABBAAABAAAAABAAAAABBAAAAABAABABABABAAABBABBABBBAAAAAAAAAABAABABAABBAAABBBABBABAAAAAAAABAAAABAAAABBAAAAAABBAABAABBABAAAABBBBABAABAAABAABABBAABABABBBBBBBABAABBBABBBBBABBBABBBBBBAABBBBBAAABBBAABBBABBABAAABAABAABBBBBBAABAABBBAAAAABAAABBBAAAAABBABABABABABBBAAAAABAAABBABBBAAABBAABABBAABAABBBABBBBAAABBABBAAAABBBABBABAABAABBBAABBAAABBAABAAAAABBAABBBABBBBAABAAABABBAAABBAABABBBBABBABABBABABAABABABABABBBABBBAABBAABBAAAAABBABBAAAABBABBBAAABBBBABBABBBABBBABBABBBAABAAAABBAAABABAABBBAABAABBBBABBBBBBBAAAAABABAABBAABBBBBBBAAABABBBBBAAABBABABABAABBAAAAAABBABAAAABBBABAAAAAAAABABAAABAAAAABAAABAABABBBABAAABBAAAAABAABABBABABBAAABABABBABABBAAABAAAABABBBABBBAABBBBAABBAAAAABBABBBBBAABABBBBBBAAAAAAAAABABABBBAABBABBBBAABABABBBABBAABBBBBAABBBBBAAABBBBBAABBABABAABABABABABBABAAABBABBBAAABABBBAAABBAABAABABBBAAABBABBBAABBAAABBAAABABBAABABABABABABBAAAABABAABBBABBBABABBBABBABABBAABBBAABBAAAABAAAAABBBBABAAABBBBABBBBBABABABBAABABAAABABABABAABABBABABAABBBABBABAABAAAAABBABBBAAAABAAAABABBBBAABBBABABBAAABBAABABBAAABAABBABBABBAABBBBAABAAAAAABAABABBABABBAAABBBAAAABBAABAABBBBABBBBBBABAABAABABABBAABAAABBBBABBBABBBBABBBBABBABBBBABBBBABAAABAABBAABBAABBBAABBAABAABABABABABABBBABABAABABABAAABAABAABABAABBBAAAABBBBBBBBBBABABAABAABBAABABAABBABAABBBBBBBBAAABABAAAABBAABABBAAABAAABBAABABBBBAABABBBBABABBBAABBBAAAABAAAABBAABBBAAABAAAABAAAAABABBABBBBAAAABBABABAAABABBAAABBBAAAABBAABABBABAAABAAABBBABABBBBAABABBBBBABBBBBABBABABAAAAABBAABBBBAABBBBBABABBABABABAABBBABBBAABAAABBABABABAAAAABBABBABAABAAAABABAAABBBBAAABBAABBBABBBBAAABABAAABBBBABAABABBBBBAAAAABAAAABABBBAAABABBBBAABABABABAABBAABABBABBBBBBABAAABABBBAABABBAABBAABBABBBAABBAABBABABABABBBBAABABABBABBABBAABBBAABBBABBBAABABAAABABBBBABABBBAAABAA

storage5/mmap.c

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#define _BSD_SOURCE
2+
#include <sys/mman.h>
3+
#include <sys/types.h>
4+
#include <fcntl.h>
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <string.h>
8+
#include <unistd.h>
9+
10+
11+
// This is a 3-file setup:
12+
// Start with a file full of 4096 X's
13+
// If you run this with no arguments, we just mmap the file and repeatedly
14+
// read it.
15+
// If you pass an argument, we take the first character and randomly write
16+
// that character to an offset in the file.
17+
#define MMAP_FILE_SIZE 4096
18+
19+
int main(int argc, char *argv[]) {
20+
const char *datafile = "data.in";
21+
char printchar;
22+
int fd, is_reader;
23+
char *buf;
24+
25+
if (argc < 2) {
26+
// This is the reader process
27+
is_reader = 1;
28+
} else {
29+
is_reader = 0;
30+
printchar = argv[1][0];
31+
}
32+
33+
// We're going to open a file for mmapping and then we're going to
34+
// loop updating our character.
35+
fd = open(datafile, O_RDWR);
36+
if (fd < 0) {
37+
perror("open");
38+
exit(1);
39+
}
40+
// mmap 4096 bytes starting at offset 0
41+
buf = mmap(NULL,
42+
MMAP_FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
43+
44+
// Seed the random number generator so that different processes
45+
// will do different things.
46+
srandom((unsigned int)getpid());
47+
while (1) {
48+
if (is_reader) {
49+
// Output 64 bytes at a time
50+
for (int i = 0; i < MMAP_FILE_SIZE; i += 64)
51+
printf("%.64s\n", buf + i);
52+
sleep(1);
53+
} else {
54+
// Pick an offset in the buffer and write to it.
55+
buf[random() % MMAP_FILE_SIZE] = printchar;
56+
usleep(1024);
57+
}
58+
}
59+
60+
exit(0);
61+
}

storage5/reset.sh

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/bash
2+
3+
sed -e 's/A/X/g' -e 's/B/X/g' data.in > data.out
4+
mv data.out data.in

storage5/stdio.c

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#define _BSD_SOURCE
2+
#include <sys/mman.h>
3+
#include <sys/types.h>
4+
#include <fcntl.h>
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <string.h>
8+
#include <unistd.h>
9+
10+
11+
// Try to emulate what we're doing in mmap with fwrite
12+
// This is a 3-file setup:
13+
// Start with a file full of 4096 X's
14+
// If you run this with no arguments, we just read the file and print it.
15+
// If you pass an argument, we take the first character and randomly write
16+
// that character to an offset in the file.
17+
#define MMAP_FILE_SIZE 4096
18+
19+
int main(int argc, char *argv[]) {
20+
const char *datafile = "data.in";
21+
char printchar;
22+
int is_reader;
23+
char buf[MMAP_FILE_SIZE];
24+
FILE *fp;
25+
off_t off;
26+
27+
if (argc < 2) {
28+
// This is the reader process
29+
is_reader = 1;
30+
} else {
31+
is_reader = 0;
32+
printchar = argv[1][0];
33+
}
34+
35+
// We're going to open a file for mmapping and then we're going to
36+
// loop updating our character.
37+
fp = fopen(datafile, "r");
38+
if (fp == NULL) {
39+
perror("open");
40+
exit(1);
41+
}
42+
// Seed the random number generator so that different processes
43+
// will do different things.
44+
srandom((unsigned int)getpid());
45+
while (1) {
46+
if (is_reader) {
47+
if (fseek(fp, 0, SEEK_SET) != 0 ||
48+
fread(buf, MMAP_FILE_SIZE, 1, fp) != 1) {
49+
perror("fread");
50+
exit(1);
51+
}
52+
for (int i = 0; i < MMAP_FILE_SIZE; i += 64)
53+
printf("%.64s\n", buf + i);
54+
sleep(1);
55+
} else {
56+
// Pick an offset and write it using stdio.
57+
off = random() % MMAP_FILE_SIZE;
58+
if (fseek(fp, off, SEEK_SET) != off ||
59+
fwrite(&printchar, 1, 1, fp) != 1) {
60+
perror("writer failed\n");
61+
exit(1);
62+
}
63+
usleep(1024);
64+
}
65+
}
66+
67+
exit(0);
68+
}

storage5/syscall.c

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#define _BSD_SOURCE
2+
#include <sys/mman.h>
3+
#include <sys/types.h>
4+
#include <fcntl.h>
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <string.h>
8+
#include <unistd.h>
9+
10+
11+
// Try to emulate what we're doing in mmap with write
12+
// This is a 3-file setup:
13+
// Start with a file full of 4096 X's
14+
// If you run this with no arguments, we just read the file and print it.
15+
// If you pass an argument, we take the first character and randomly write
16+
// that character to an offset in the file.
17+
#define MMAP_FILE_SIZE 4096
18+
19+
int main(int argc, char *argv[]) {
20+
const char *datafile = "data.in";
21+
char printchar;
22+
int is_reader;
23+
char buf[MMAP_FILE_SIZE];
24+
int fd;
25+
off_t off;
26+
27+
if (argc < 2) {
28+
// This is the reader process
29+
is_reader = 1;
30+
} else {
31+
is_reader = 0;
32+
printchar = argv[1][0];
33+
}
34+
35+
// We're going to open a file for mmapping and then we're going to
36+
// loop updating our character.
37+
fd = open(datafile, O_RDWR);
38+
if (fd < 0) {
39+
perror("open");
40+
exit(1);
41+
}
42+
// Seed the random number generator so that different processes
43+
// will do different things.
44+
srandom((unsigned int)getpid());
45+
while (1) {
46+
if (is_reader) {
47+
if (lseek(fd, 0, SEEK_SET) != 0 ||
48+
read(fd, buf, MMAP_FILE_SIZE) != 4096) {
49+
perror("read");
50+
exit(1);
51+
}
52+
for (int i = 0; i < MMAP_FILE_SIZE; i += 64)
53+
printf("%.64s\n", buf + i);
54+
sleep(1);
55+
} else {
56+
// Pick an offset and write it using stdio.
57+
off = random() % MMAP_FILE_SIZE;
58+
if (lseek(fd, off, SEEK_SET) != off ||
59+
write(fd, &printchar, 1) != 1) {
60+
perror("writer failed\n");
61+
exit(1);
62+
}
63+
usleep(1024);
64+
}
65+
}
66+
67+
exit(0);
68+
}

0 commit comments

Comments
 (0)