UGA Bulletin Logo

Systems Programming


Course Description

Programs and programming techniques used in systems programming in Unix environments. Focus on Unix system call interfaces and the interface between the Unix kernel and application software running in Unix environments. Students will learn the basics of Unix systems programming, including file and directory structures, basic and advanced file I/O, process creation, and inter-process communication.


Athena Title

Systems Programming


Equivalent Courses

Not open to students with credit in CSCI 1730E


Prerequisite

CSCI 1302


Semester Course Offered

Offered fall, spring and summer


Grading System

A - F (Traditional)


Course Objectives

1. Navigate a Unix-based system and use tools and commands for system programming. 2. Trace, design, and implement software solutions to non-trivial problems using the C programming language. 3. Trace, design, and implement software solutions to non-trivial problems using the C++ programming language. 4. Trace, design, and implement programs that spawn multiple processes or multiple threads and utilize inter-process communication. 5. Understand the binary representation of integers in memory and use bitwise operators to solve problems. 6. Compare and contrast various programming paradigms.


Topical Outline

1. Systems Programming Tools a) Use emacs or vi to write programs in a Unix environment. b) Use basic Unix commands including (but not limited to): cd, pwd, mkdir, ls, grep, man, apropos, ps, kill, top, less, more, chmod, cp, mv, rm, diff, sort, wc, and find. c) Use the command line in a Unix environment to run processes and to pipe or redirect input or output. d) Demonstrate an understanding of the Unix file system by changing file permissions to allow programs to open, close, read, and write files. e) Use a Makefile to compile and run a program with more than one header file and more than one source code file. f) Use GDB to debug programs with various errors. g) Use Valgrind to find memory leaks in programs. Implement programs that use dynamic memory allocation and deallocation and have no memory leaks. 2. C Programming a) Compile, link, and run programs via the command line. b) Design and implement header files that use preprocessor directives. c) Design and implement programs that use basic programming and flow of control structures such as (but not limited to) variables, operators, expressions, decision statements, loops, pointers, and functions (prototyping, calling, and passing arguments to functions). d) Demonstrate knowledge of simple data structures (arrays, strings, structs, enums, unions) by writing out their memory maps and tracing through the output of source code. e) Demonstrate knowledge of pointers and arrays by tracing through the output of source code containing pointers to 1D arrays, 2D arrays, and 3D arrays. f) Design and implement programs that use command-line arguments. g) Design and implement programs in a Unix environment that open, close, read, and write files. h) Design and implement a program that uses pointers and dynamic memory allocation and deallocation. 3. C++ Programming a) Design and implement basic object-oriented and structured programming concepts in C++. b) Use simple data structures and classes in C++ such as string, vector, and list. c) Design and implement a program that consists of more than one class, a constructor, a destructor, a pointer, and more than one object. 4. Process and Inter-process Communication a) Design and implement programs that use system calls and signal handling (fork, exec, wait, etc.) and run concurrently. b) Design and implement programs that use pipe and dup2 for input/output redirection and inter-process communication. c) Design and implement a multithreaded program. d) Design and implement client and server programs that communicate via a socket in a Unix environment. 5. Binary Representation a) Understand how unsigned integers are represented and stored in memory by converting unsigned integers to and from base-10 to binary. b) Understand how signed integers are represented and stored in memory using two’s complement representation by converting signed integers to and from base-10 to binary. c) Design and implement a program that uses bitwise operators on unsigned integers. 6. Programming Paradigms a) Explain some key differences between Java, C++, and C such as (but not limited to): object-oriented vs. procedural programming languages, lower-level vs. higher-level programming languages, dynamic memory allocation and deallocation, and pointers. b) Compare and contrast generic models in C, C++, and Java (e.g. void pointers vs templates/generics, templates/generics vs macros).


Syllabus