diff --git a/ANSWERS.md b/ANSWERS.md index 9e5261a..2bb0bbb 100644 --- a/ANSWERS.md +++ b/ANSWERS.md @@ -19,7 +19,7 @@ Please use [markdown](https://help.github.com/articles/markdown-basics) formatin Make another directory inside the `unixstuff` directory called `backups` -**Answer:** *YOUR ANSWER HERE* +**Answer:** *mkdir -p unixstuff/backups* ###Exercise 1b @@ -27,31 +27,54 @@ Use the commands `cd`, `ls` and `pwd` to explore the file system. (Remember, if you get lost, type `cd` by itself to return to your home-directory) -**Answer:** *YOUR ANSWER HERE* +**Answer:** +``` +$ mkdir -p unixstuff/backups +$ cd unixstuff +$ ls +backups +$ cd backups +$ ls +$ cd ../../ +$ pwd +/home/ragnvald/labs/lab1 +``` ###Exercise 2a Create a backup of your `science.txt` file by copying it to a file called `science.bak` -**Answer:** *YOUR ANSWER HERE* +**Answer:** *cp science.txt science.bak* ###Exercise 2b Create a directory called `tempstuff` using `mkdir`, then remove it using the `rmdir` command. -**Answer:** *YOUR ANSWER HERE* +**Answer:** *mkdir tempstuff;rmdir tempstuff* ###Exercise 3a Using the above method, create another file called `list2` containing the following fruit: orange, plum, mango, grapefruit. Read the contents of `list2`. -**Answer:** *YOUR ANSWER HERE* +**Answer:** +``` +$ cat > list2 +orange +plum +mango +grapefruit +$ cat list2 +orange +plum +mango +grapefruit +``` ###Exercise 3b Using pipes, display all lines of `list1` and `list2` containing the letter 'p', and sort the result. -**Answer:** *YOUR ANSWER HERE* +**Answer:** *cat list1 list2|grep p|sort* ###Exercise 5a @@ -59,77 +82,99 @@ Try changing access permissions on the file `science.txt` and on the directory ` Use `ls -l` to check that the permissions have changed. -**Answer:** *YOUR ANSWER HERE* +**Answer:** +``` +$ chmod 700 unixstuff/backups/ +$ chmod 600 science.txt +$ ls -la science.txt unixstuff/backups/ +-rw------- 1 ragnvald ragnvald 0 Aug 27 15:45 science.txt + +unixstuff/backups/: +total 8 +drwx------ 2 ragnvald ragnvald 4096 Aug 27 15:23 . +drwxr-xr-x 3 ragnvald ragnvald 4096 Aug 27 15:23 .. +``` ##Shell questions 1. What option with the command `rm` is required to remove a directory? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *-r* 1. What is the command used to display the manual pages for any command? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *man* 1. What command will show the first 5 lines of an input file? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *head -n5 file* 1. What command can be used to rename a file? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *mv* 1. What option can we given to `ls` to show the hidden files? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *-a* 1. What will the command `cat -n file` do? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *View line numbers in addition to the text in the file* 1. What will the command `echo -n hello` do? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *print hello without trailing newline* 1. What command will display s list of the users who currently logged in in the system? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *who* 1. How do you change password on your account? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *passwd* 1. How can you list a file in reverse order? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *tac file* 1. What does the `less` command do? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *view file contents* 1. With `less` how do you navigate? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *j,k,up,down,pgup,pgdn,enter,space* 1. What command will display the running processes of the current user? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *ps x* 1. What command can be used to find the process(es) consuming the most CPU? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *top* ##vi questions 1. How do we save a file in `vi` and continue working? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *:w* 1. What command/key is used to start entering text? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *i* 1. What are the different modes the editor can be in? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *command and insert* 1. What command can be used to place the cursor at the beginning of line 4? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *:4* 1. What will `dd` command do (in command-mode)? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *Delete the line with the cursor on it* 1. How do you undo the most recent changes? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *u* 1. How do you move back one word? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *b* ##The C Language and Make tool Questions 1. How do you use `gcc` to only produce the `.o` file? What is the difference between generating only the `.o` file, and building the `hello` executable done in the previous compilation above? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *Use -c. This will combile and assemble, but not link the object file into an executable* 1. Give the command for compiling with `debug` enabled instead of normal compilation for the two examples shown in Listing 2 and Listing 3. Explain how to turn debugging on/off for the two cases. - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *Enabling debug in the first file is done by passing -DDEBUG to command line. In the second example it's enabled by setting debug to 1 at runtime.* 1. Give a brief pros and cons discussion for the two methods to add debug code shown in Listing 2 and Listing 3. - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *First method will not include debug code in the resulting executable unless explicitly enabled, which will lead to a smaller and more efficient binary. The second method will include debug code, but it does not need to ever run. Enabling the code can be done at runtime if neccessary.* 1. Provide the command for generating the *map* file. Which of the `gcc` tools is responsible for producing a *map* file? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *-Wl,-Map=out.map : ld is responsible for producing it.* 1. What is the content of each of the sections in a *map* file. Explain briefly. - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *.rodata=constants : .bss=uninitialized and zero-initialized variables : .data=Initialized variables* 1. Rewrite `hello.c` to produce entries in the *map* file for `.data`, `.bss`, and `.rodata`. Hint: This can be done by adding one variable for each type to the file. - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** +``` +#include +const int one = 1; +int two = 2; +int zero = 0; +int uninitialized; +int main(void) { + printf("Hello, world! %d %d %d %d\n",zero,uninitialized,one,two); + return 0; +} +``` 1. Add the following function to `hello.c`: `double multiply(double x1, double x2)`, which returns `x1*x2`. Use `gcc` to generate an assembly code listing for the program, and examine the assembly code. What assembly instructions are used to do this? Repeat this task, but now replace `double` with `float`. Explain! - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *movq, movss,mulss,movl is used in float example. movq,movsd,mulsd is used in double example. Instead of using rax for result, eax is used in float example. pushq is used to start multiply routine, and popq to return* 1. How does `make` know if a file must be recompiled? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *It keeps track of which files have changed since last compile, and recompiles only what is neccessary* 1. Provide a `make` command to use a file named `mymakefile` instead of the default `makefile`. - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *make -f mymakefile* 1. How do you implement an *include guard*, and why is it needed? - - **Answer:** *YOUR ANSWER HERE* + - **Answer:** *#ifdef, #define, #endif preprocessing constructs in headers can act as an include guard. It's needed to prevent files from being included more than once* ##Library Task diff --git a/applib/Makefile b/applib/Makefile new file mode 100644 index 0000000..bf76358 --- /dev/null +++ b/applib/Makefile @@ -0,0 +1,19 @@ +CC=gcc +CFLAGS=-c -Wall -O2 +LDFLAGS= +SOURCES=main.c l1.c +OBJECTS=$(SOURCES:.c=.o) +EXECUTABLE=tabsort + +all: $(SOURCES) $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) -o $@ + +.c.o: + $(CC) $(CFLAGS) $< -o $@ + +clean: + rm *.o ${EXECUTABLE} + + diff --git a/applib/l1.c b/applib/l1.c new file mode 100644 index 0000000..5b386f1 --- /dev/null +++ b/applib/l1.c @@ -0,0 +1,18 @@ +#include +#include + +int cmpfunc(const void *a, const void *b) { + if (*(double*)a > *(double*)b) return 1; + else if (*(double*)a < *(double*)b) return -1; + return 0; +} + +double tab_sort_sum(double *table, int size) { + double sum = 0.0; + int i; + for (i=0; i +#include +#include +#include "l1.h" + +#define TABLE_SIZE 30 + +int main(int args, char *argv[]) { + double table[TABLE_SIZE]; + srand(time(NULL)); + int i; + double min = 0.0; + double max = 100.0; + double sum; + if (args == 3) { + min = atof(argv[1]); + max = atof(argv[2]); + } + for (i=0; i +int main(void) { + #ifdef DEBUG + printf("Debug\n"); + #endif + printf("Hello, world!\n"); + return 0; +} diff --git a/debug2.c b/debug2.c new file mode 100644 index 0000000..184e58d --- /dev/null +++ b/debug2.c @@ -0,0 +1,9 @@ +#include +int debug = 0; +int main(void) { + if(debug) { + printf("Debug\n"); + } + printf("Hello, world!\n"); + return 0; +} diff --git a/hello.c b/hello.c new file mode 100644 index 0000000..54c401d --- /dev/null +++ b/hello.c @@ -0,0 +1,17 @@ +#include +const int one = 1; +int two = 2; +int zero = 0; +int uninitialized; + + +float multiply(float x1, float x2) { + return x1*x2; +} + + +int main(void) { + printf("Hello, world! %d %d %d %d\n",zero,uninitialized,one,two); + printf("%f\n", multiply(3,4)); + return 0; +}