COMP 3000 2012 Midterm Material

From Soma-notes
Revision as of 21:52, 22 October 2012 by Sdp (talk | contribs) (added questions from Lab 3)

Questions from Lab 1

  1. What is your username on this wiki? Have a TA help you create an account.
  2. What Linux distribution are you using? What version? You should look at the file /etc/issue generally to find out.
  3. What shell do you get by default when you log in? Check by running echo $SHELL. If it is not bash, then type exec bash to switch to it.
  4. Is your Linux environment running virtualized or on bare metal? How do you know? (If you aren't sure, say so, but explain why.)
  5. Who installed and configured your Linux environment? What level of access do you have to it?
  6. A shell command can be one of four things. What are those four things? Explain very briefly.
  7. On the machine you are on, in what directories are commands external to the shell stored? How can you get this information on the command line?
  8. Compare the commands ls /usr/bin | more and ls /usr/bin | less. How is the output similar? How are they different?
  9. How would you create an empty file with the filename empty file.txt? (Yes, that is a space in the filename.)
  10. How would you output the contents of this file?
  11. Some shell commands, such as pwd, are both built-in and are external. What is one reason why both versions might be present?
  12. What are the permissions on your Linux home directory? With those permissions and your knowledge of the other accounts on the system, who has access to your home directory, and what sort of access do they have?
  13. Give one or more command line strings that use the following operators: >, <, >>, <<, |. Explain briefly what each operator is doing in your examples, both concretely and in terms of STDIN and STDOUT.
  14. Are there operators that work specifically with STDERR? Explain briefly.
  15. How do you use these operators with other file descriptors? Explain briefly.
  16. Give an example of a bash for loop and explain what it does.
  17. Give an example of a bash if statement and explain what it does.
  18. With the & you can put processes in the "background". Given that external commands are always run as separate processes from the command shell, what is the key difference between foreground and background processes?
  19. What are the differences between shell and environment variables? Specifically, what processes have each of them, and to what extent are they shared? HINT: look at the execve system call.

Questions from Lab 2

  1. How can you get a list of all of the processes running on the system from the command line? Please give the command and required arguments, if any.
  2. What are five processes that are running on your system as non-regular users (i.e., as users other than the one you logged in as)? What does each do, briefly? Note: please exclude all processes enclosed in [], as those are built in to the kernel.
  3. How can I restart the graphical login screen on Ubuntu? (Hint: use virtual terminals and Ctrl-Alt-F? combinations to access a terminal that is independent of the GUI. Also, make sure you are aren't logged into a graphical session when you try this!)
  4. What happens when you send a kill -9 signal to one of the getty processes that are running by default? Why?
  5. What starts the upstart daemon? When is it started?
  6. How would you "change the system runlevel" to reboot? Shut down?
  7. Look at the output of ls -l /etc/init.d/. You will note -> for many of the entries. This arrow shows that those entries are symbolic links. Where do most of these symbolic links point to? Why?
  8. Install the openssh-server package in your virtual machine from the command line. What command(s) did you use?
  9. Note that sshd has separate entries in /etc/init and /etc/init.d differ. Why do both exist (when most services have either one or the other)?
  10. Log messages for the system are stored in /var/log. What are four log files that are present on your system? (Ignore the ones with numeric extensions, those are old versions.) What program wrote each of those files directly?
  11. In /etc/init.d/ssh there are two lines near the beginning that end with output || exit 0 (should be lines 16 and 17). What do each of these lines do exactly? And what is there purpose?
  12. What are the equivalent lines, if any, to these || exit 0 lines in /etc/init/ssh?
  13. What is plymouth?
  14. BONUS: Trace plymouth's behavior throughout the boot process.

Questions from Lab 3

  1. Compile the program hello.c (below) with gcc -O hello.c -o hello-dyn and then run it using the command ltrace ./hello-dyn . What dynamic functions does the program call?
  2. Compile the same program with gcc -O -static hello.c -o hello-static . Run this second binary with ltrace as before. What dynamic functions does the program now call?
  3. Run strace on the static and dynamically compiled versions of hello. How many system calls do they each produce?
  4. How can you make the output of hello.c go to the file "hello-output" by changing how it is invoked at the command line?
  5. How can you make the output of hello.c go to the file "hello-output" by changing its code?
  6. Compile run-program.c with the command gcc -g run-program.c -o run-program and use it to answer the following questions.
    1. Is the line "Is this line printed?" printed when you execute ./run-program /bin/ls -a /tmp? Why?
    2. Change the program to use execve instead of execvp. What is the difference between the two functions?
    1. Linux signals is a simple form of IPC that is used for a variety of purposes.
      1. What signal is generated when a program attempts to divide by zero? Give a simple program that generates such a signal.
      2. How would you send a signal to a process to have it pause execution? Resume?
      1. What command can lower the priority of an already running process?
      2. Why do we "open" files? Specifically, to what extent is it possible to do file I/O without open and close operations - assuming you could change the UNIX API?
      3. What is the relationship between function calls, system calls, and library calls?
      4. Create run-program-skips.c that is the same as run-program.c except that it ignores every other argument to the program to be run (starting with the first non-program-name argument). Hence, ./run-program-skip /bin/ls ignore -a ignore /tmp will do the same as ./run-program /bin/ls -a /tmp.
      5. Create sanitize-env.c that does the same as run-program.c except it exec's the program with all environment variables stripped except the PATH and TERM variables (assuming they are defined). Be sure to document how you tested your program.
      6. Create a simple program receive-term.c that uses sigaction in order to print "Ouch!" when you send the program the TERM signal and then exits. Note that your program should not consume much CPU time while waiting (i.e., do not poll for the signal). As part of your answer, give the command for sending the signal.
      7. Create a simple program nocrash.c that accesses an invalid pointer but then prints "Oops, my mistake" rather than crash.
      8. Create a program run-program-dots.c that works the same as run-program.c, except that it prints one dot every second while a given program runs. Note that it should stop printing dots once the exec'd program terminates. Your solution should use the fork(), sleep(), execve(), and sigaction() calls.
      9. What is the difference between the PR and NI columns in the top command? Explain in the context of running a CPU-intensive program. (Hint: you should try running a CPU intensive program or two and observe these columns...)

      Program Listings

      /* hello.c */
      #include <stdio.h>
      #include <unistd.h>
      
      int main(int argc, char *argv[])
      {
             pid_t p;
      
             p = getpid();
            
             printf("Hello, world!  I am process %d.\n", (int) p);
             return 0;
      }
      

      /* run-program.c */
      
      #include <unistd.h>
      #include <stdio.h>
      
      int main( int argc, char *argv[], char *envp[] ) {
      
         pid_t p;
      
         p = getpid();
            
         printf("Hello again.  I am process %d.\n", (int) p);
      
         if( argc < 2 ) {
             printf( "Insufficient arguments.\n" );
             return -1;
         }
         execvp( argv[1], argv + 1 );
         printf( "Is this line printed?\n" );
         return 0;
      }