// // An application that updates file "grades" so that // after a crash the file will have either the new // or old contents (but not be e.g. empty). // In real life you should check all syscall returns. // main() { int fd, cc; char buf[512]; // read existing file into memory fd = open("grades", 0); cc = read(fd, buf, sizeof(buf)); close(fd); // change a grade in memory buf[0] = 'A'; // write to a temporary file fd = creat("temp1234", 0600); write(fd, buf, cc); fsync(fd); // wait until everything on disk close(fd); // atomically replace old file with new rename("temp1234", "grades"); } $ $ echo > x bwrite 4 ialloc inum 18 bwrite 4 iupdate inum 18 bwrite 29 writei inum 1 * $ echo z > x bwrite 28 balloc bn 337 bwrite 337 writei inum 18 bwrite 4 iupdate inum 18 bwrite 337 writei inum 18 bwrite 4 iupdate inum 18 $ rm x bwrite 29 writei inum 1 ** bwrite 4 iupdate inum 18 bwrite 337 bzero bwrite 28 bfree bn 337 bwrite 4 iupdate inum 18 bwrite 4 iupdate inum 18 $ echo > y bwrite 4 ialloc inum 18 bwrite 4 iupdate inum 18 bwrite 29 writei inum 1 ** $ (file /a already exists w/ i-num 19) $ $ echo > b bwrite 4 ialloc inum 20 bwrite 4 iupdate inum 20 bwrite 29 writei inum 1 $ rm a bwrite 29 writei inum 1 bwrite 4 iupdate inum 19 bwrite 4 iupdate inum 19 bwrite 4 iupdate inum 19 $