This course explores low-level topics in machine representation of programs and data. For our reference system, we're using CentOS Linux. Other Linux and Mac OS X systems are very similar, and Windows machines also use the same underlying processors and memory organization. But for assignments in this course, your submissions need to work on, and will be graded on, our reference system.
This is a quick little tutorial on how to get yourself up and running
on Linux. If you are a CSE major, then you have access to departmental
servers collectively called attu
(actually reached at
attu.cs.washington.edu
). You are welcome to
use attu
or the CSE virtual machine, which are running
the same Linux image. If you are using the CSE virtual machine, then
read just “Shell on Linux” and then from “Finding
your way around the shell” onward.
Windows' default command line interfaces are Command Prompt and PowerShell, which use a different set of commands and tools and behave differently than the shells on Mac and Linux. Instead, you can connect to attu using either of the following methods:
The Mac OS X Terminal behaves very similarly to most Linux shells. As a result, most of the commands on Terminal will be the same as those from a Linux shell. However, to use the Linux shell commands for 351, we will connect to attu.
Click the Spotlight Search button in the upper-right, type “terminal”, and press return.
You won't need to do any special setup on Linux, as you have a shell installed. It is still recommended that you connect to attu to ensure that you have all of the tools needed and are using the same environment as everyone else.
Click Applications at the top, mouse to Accessories, and click Terminal.
Attu is a powerful computer sitting in the CSE building that is ready to run your work, except that it has no screen. It runs Linux, and can only be accessed over the network. You will be granted an account (your UWNetID) on attu for the quarter. attu has all of the commands that you will need in the 351 labs, and is built to be fast, so more often than not it's most convenient to run lab programs on attu.
Accessing attu from Windows (PuTTY)
putty.exe
from wherever you downloaded it.<your-csenetid>@attu.cs.washington.edu
Accessing attu from Windows (bash), OS X, or Linux
ssh <your-uwnetid>@attu.cs.washington.edu
and press [Enter].yes
and press [Enter].Changing your attu password
If you would like to change your Kerberos password, type passwd
into the command prompt and press [Enter], then follow the instructions given.
First off, folders are a fancy word that Microsoft invented to make comptuers seem more human. While folders are great, they're called directories on Linux.
The first thing that most new users shifting from Windows will find confusing is navigating the Linux filesystem. The Linux filesystem does things a lot more differently than the Windows filesystem.
/
)For starters, there is only a single hierarchal directory structure.
Everything starts from the root directory, represented by '/
', and then
expands into sub-directories. Where DOS/Windows had various drives
(C:, D:, etc) and
then directories under those partitions, Linux places all the drives
under the root directory by 'mounting' them under specific directories.
The closest parallel to the root directory in Windows would probably be C:.
Another point likely to confuse newbies is the use of the frontslash '/' instead of the backslash '\' as in DOS/Windows. So c:\windows\system would be /c/windows/system. Well, Linux is not going against convention here. Unix has been around a lot longer than Windows and was the standard a lot before Windows was. Rather, DOS took the different path, using '/' for command-line options and '\' as the directory separator.
~
)To keep people from stepping on everybody's toes, everybody has one
directory that they can write and make changes to. This is
called your “home directory”. On any Unix system, you can
refer to the home directory with a tilde, so a folder called frogs
inside of your home directory would have a path like:
~/frogs
When you run a command, your shell will replace ~
with the path to
your home directory. If you want to know what that is or how to
manipulate the shell, read the next section on basic Unix commands.
.
and ..
)The shell also allows you to directly reference directories relative to your current working
directory. '.
' represents the current working directory. '..
' refers to
the direct parent of the current working directory.
This can be pretty handy in working your way around your directory structure. For example, if you are in the
folder lab1
, a sibling directory lab2
would be referred to as:
../lab2
To move around through the directory structure in your terminal window,
you'll need to know a few basic Unix commands. Note that you always start in your home directory
when you open a terminal.To get help on some command, say you want to know how to use
ls
, type man ls
and you will get the manual pages for that command.
(Alternatively, you can use info
in the same way.)
Command | Function | Example | Explanation | Notes |
---|---|---|---|---|
mkdir |
Creates a new directory with the given name in the current working directory. | mkdir lab1 |
This will create a new directory called "lab1 ". |
|
ls |
Lists all directories and files in the current directory. | ls -A |
This will list all sub-directories and files. The -A flag means that hidden directories and files will also be printed to the console. | Check the manual page for ls to find out various flags to show directories and files in different forms. |
cd |
Navigates to the specified directory, given its relative path. | cd lab1 |
This will navigate to the lab1 directory inside the current directory. |
This is a common place where . and .. are used. Also, to use a directory's absolute path, start the directory name with either / or ~ . For example:cd ~/cse351/lab2 |
pwd |
Prints the current working directory path. | pwd |
This will print the current working directory's absolute path to the console. | |
exit |
Exits the console, or logs out of the current SSH session. | exit |
This will terminate the current terminal window. If you are SSH'd into attu, this will terminate your session. |
Here is a sample execution of some Unix commands. The attu%
is just the prompt telling you that
you're logged into attu.
attu% mkdir mydir attu% ls mail mydir attu% cd mydir attu% pwd /homes/iws/djg/mydir attu4% exit
These are just the very minimum basics, of course. CSE 391 covers the Linux system in further depth.
The shell is the program where you type in commands. There are
different shell programs, which are all similar but have different
rules and features. For sake of uniformity, we will use a shell
called bash
, and your account should be set up to use this
by default. You can check using the following
command: [attu]$ echo $0
.
In case the output isn't bash
or -bash
(or you're updating your personal Linux machine), you can change the shell temporarily or permanently. We strongly recommend the latter, but we'll explain the former first to help you understand what is going on.
Temporarily: Type [attu]$ bash
.
Now you may have a different-looking prompt (such as [bash-3.00]$
), but otherwise at this point you will not notice any differences.
Note that instead of changing your shell, you've actually opened up a new shell (we'll discuss processes in this course), so when you type [bash-3.00]$ exit
, you'll actually return to the original shell (the one you typed bash
into).
Permanently: Instead, you can tell the operating system that the “first shell” for every terminal should be bash for your account.
From any prompt, type: [attu]$ chsh -s /bin/bash
.
You are running the "change shell" program and specifying that your new shell can be found at /bin/bash
.
It's almost that simple:
As a final note, if your shell already is bash, chsh
will just say “Shell not changed.”
First thing's first: There is a ton of debate about this.
For this course, you can use something as simple as Notepad. However, we strongly recommend something better to help you read and debug your code. Here is a list of things, by OS, that we recommend:
Options, where we recommend the first choice in most circumstances:
When you run a command like btest
on attu, you may see something
like the following:
Gives 1942614435[0x73c9f1a3]. Should be 204869213[0xc360e5d] ... 9 total errors for function abs Test abs score: 0.00/4.00 Test addOK(-2147483648[0x80000000],-2147483648[0x80000000]) failed. Gives -2147483648[0x80000000]. Should be 0[0x0] Test addOK(-2147483648[0x80000000],2147483647[0x7fffffff]) failed. Gives -2147483648[0x80000000]. Should be 1[0x1] Test addOK(-2147483648[0x80000000],-3[0xfffffffd]) failed. Gives -2147483648[0x80000000]. Should be 0[0x0] Test addOK(-2147483648[0x80000000],811666840[0x30610d98]) failed. Gives -2147483648[0x80000000]. Should be 1[0x1] Test addOK(-2147483648[0x80000000],-2147483647[0x80000001]) failed. Gives -2147483648[0x80000000]. Should be 0[0x0] ... 321 total errors for function addOK Test addOK score: 0.00/3.00 Overall correctness score: 14.00/36.00 1541 errors encountered.
What happened to the first part of it? Answer: it scrolled up past the top of your terminal. You'll have to tell attu you want to save all of that output somewhere, like this:
./btest > feedback_filename
If you run btest (or any command) like this, Linux will save its
output in the file called feedback_filename
(careful, it will overwrite existing files) for you to
view later in your favorite text editor.
Alternatively, if you just want to see the output once, try it this way:
./btest | less
You can then use the up/down arrow keys to move around your output
in a quick n dirty fashion. Use the 'q' key to quit. Be aware: Once
you quit, the output is gone for good! But, luckily for you, you
can just re-run btest to get it back. You can also use less to view
the output from your saved file, like less feedback_filename
.
Not everything is perfect, sadly :(. One of those is our build
system. Though it is unlikely, the rule of thumb when running the make
command is:
If something really doesn't look like it's running right, do a
make clean
, then a make
and try it
again.
To save time, make and gcc will save some of the computation required to build your software. However, at times, this can become corrupt and interfere with changes you're making.