Everyone:
This week, we will review system calls, which are the interfaces through which user applications can request services from the operating system kernel. Instead of manipulating data directly on a hard drive or directly controlling a CPU, we use the abstractions of a file and process to perform our desired actions. The OS virtualizes the physical resources of a hard drive and a CPU and allows us to access these virtual objects through system calls such as open and fork.
These abstractions make it easier for us to program large applications by hiding the low-level details of interacting with hardware and by allowing our programs to be portable to different machines. Of course, with any layer of abstraction there is some trade-off, and this week we will examine how operating systems virtualize the CPU via processes and how the operating system provides time sharing, different forms of multitasking, and what happens during a context switch.
For this reading assignment, you are to review basic system calls related to processes, submit your responses to the Reading 02 Quiz, and write a program that uses basic file system calls.
The readings for this week are:
Once you have done the readings, answer the following Reading 02 Quiz questions:
For this week's program, you are to modify the program.c
to implement a
basic version of the sha1sum utility:
Usage: program [file1 file2 ...]
For each argument given to
program
, compute the SHA1 digest of the contents of each file argument and display it.
The purpose of this exercise is for you to review using basic I/O system calls such as open, read, and close. If you need a refresher, please read Files and Directories from the course textbook.
$ ./program Makefile # Compute SHA1 of Makefile
50bb7f7ccf1ca089f3c5eaff5fe95e56ddbe53a5 Makefile
$ echo $? # Check exit status
0
$ ./program asdf # Handle invalid files
$ echo $? # Check exit status
1
Your program must compile cleanly with no warnings.
Your program may only use I/O system calls such as open, read, and close to access the contents of each file.
Your program must use the SHA1_Init
, SHA1_Update
, and SHA1_Final
functions provided by OpenSSL.
Your program must not have any resource leaks or memory errors as detected by valgrind.
To help you get started, the instructor suggests you review the suggestions
from Generate SHA hash in C++ using OpenSSL
library
StackOverflow post and what you did last semester in Homework 09 for
the hash_from_file
. Note, we are interested in computing the SHA1
digest.
You will want your code to be structured in the following manner:
function sha1sum_file(path, cksum):
Open file for reading
Initialize SHA1 Context
For each chunk read from file:
Update the SHA1 Context
Finalize the cksum using the SHA1 Context
Close file
function main(arguments):
For each argument:
Compute SHA1 Digest using sha1sum_file
Display SHA1 Digest in hexadecimal
Note: To link properly to the SHA1 functions, you will need to add
-lcrypto
to the LIBS
variable in your Makefile
.
Note: You will want to return 0
if all arguments were able to be processed
successfully. Otherwise, return the number of files that failed as the
exit status.
To submit you work, follow the same process outlined in Reading 01:
$ git checkout master # Make sure we are in master branch
$ git pull --rebase # Make sure we are up-to-date with GitHub
$ git checkout -b reading02 # Create reading02 branch and check it out
$ cd reading02 # Go into reading02 folder
$ $EDITOR answers.json # Edit your answers.json file
$ ../.scripts/submit.py # Check reading02 quiz
Submitting reading02 assignment ...
Submitting reading02 quiz ...
Q1 0.50
Q2 0.50
Q3 0.20
Q4 0.30
Q5 0.70
Q6 0.50
Q7 0.30
Score 3.00
$ git add answers.json # Add answers.json to staging area
$ git commit -m "Reading 02: Quiz" # Commit work
$ $EDITOR program.c # Edit your program.c file
$ make test-program # Check reading02 program
Testing reading02 program...
I/O System Calls ... Success
I/O Functions ... Success
SHA1 Functions ... Success
program ... Success
program (valgrind) ... Success
program Makefile ... Success
program Makefile (valgrind) ... Success
program Makefile README.md ... Success
program Makefile README.md (valgrind) ... Success
program Makefile README.md program.c ... Success
program Makefile README.md program.c (valgrind) ... Success
program Makefile README.md program.c asdf ... Success
program Makefile README.md program.c asdf (valgrind) ... Success
program Makefile README.md /bin/ls /bin/bash ... Success
program Makefile README.md /bin/ls /bin/bash (valgrind) ... Success
Score 3.00
$ git add program.c # Add program.c to staging area
$ git commit -m "Reading 02: Quiz" # Commit work
$ git push -u origin reading02 # Push branch to GitHub
Once you have committed your work and pushed it to GitHub, remember to create a pull request and assign it to the appropriate teaching assistant from the Reading 02 TA List.