230 likes | 426 Views
Homework / Exam. HW7 is due next class Starting Glass chapter 4 and parts of 7 Exam 3 – Class 26 Open Book / Open Notes Up through End of K&R Chapter 7 and Appendix B Standard Library Plus UNIX Shells / Processes / Shell Scripts. Remaining Course Schedule. Exam #3 is class 26
E N D
Homework / Exam • HW7 is due next class • Starting Glass chapter 4 and parts of 7 • Exam 3 – Class 26 • Open Book / Open Notes • Up through End of K&R Chapter 7 • and Appendix B Standard Library • Plus UNIX Shells / Processes / Shell Scripts
Remaining Course Schedule • Exam #3 is class 26 • HW8 is the last one - Due class 28 • Last Week of Classes - Mostly Review • Bring your questions to class • Email me any specific questions that you want me to be prepared to go over for you • Final Exam for CS240 - See posted schedule and location
UNIX Shells • A picture of the relationship between UNIX shells T Shell Korn Shell C Shell Bourne Shell Common Core Common Core
UNIX Shells • At UMB, we use tcsh, the “T shell” which is based on the C shell • Note "common core" for both shell families • Figure shows division of core features • Many important features are there and we'll cover them first, Glass Ch 4 • Then we'll go on to the C shell, Glass Ch 7
UNIX Processes • Basic to UNIX is the idea of a process • Each process contains a program in execution (It might be stopped, but it is in the system anyway). • Each process has own memory space with code, data, and program stack • Most programs we use daily are written in C and have "main (int argc, char *argv[])" through which they access the arguments on their command line • Even if not written in C, they have similar access
UNIX Shells • Shells are just programs that provide a user with a command line interface • Each shell runs in its own process for you as a user and you interact with it via commands • Typically, have shell running in parent process handling command interface sometimes with a program running under it (e.g, a command) in its own child process
UNIX Shells • The shell is a program that is basically an initialization and then a loop processing user commands • Shell interprets a user command input, does whatever that command requires, and waits for another command • Shell terminates when user types control-D at the beginning of a new line or enters the shell command to exit, typically “exit” or “logout”. • UMB standard .login files disable the control-D option • The "logout" command causes this shell and all other programs running in your UNIX session to “go away”
UNIX Shells • echo and cd are built-in shell commands--instead of running a program, the shell program detects these in the input line from the user and performs the right action itself blade64(2)% which cd find cd program path name cd: shell built-in command. • Note that cd needs to be built-in to change the current dir in the shell process • Doing that action in a program run from the shell would only change the directory for the child process not for the parent shell process itself
UNIX Shells • Non built-in shell commands are programs • “ls” or “lpr” or “vi” commands • “myprog” • How to see this – UNIX “which” command blade64(5)% which ls find ls program path name /usr/ucb/ls path name to the ls executable • These are all programs in system directories (or "myprog" which is in your own current dir) • UNIX shell simply runs the program in a child process, passing its arguments to it via argc/argv and waits for the child to exit before next prompt
Hidden Files • There are hidden files on your home directory – not normally displayed by ls • Names of these files begin with ‘.’, e.g. .login • You can see them if you use ls with –A option blade64(3)% ls -A .cshrc .plan cs240.f02 mbox private_stuff .login cs105 cs240.old playpen public_html .msgsrc cs240 cs241 playpen2 student • .cshrc is a script file executed when shell is started • .login file is a script file executed at time of login
Alias • Alias defines a new command name or overrides an existing command name: blade64(36)% alias dir "pwd;ls -lg" blade64(37)% alias dir dir pwd;ls -lg blade64(38)% dir /home/bobw total 20 drwxr-s--- 8 bobw faculty 512 Nov 19 20:57 cs105 . . . • To remove an alias: unalias dir
Shell Variables • A shell variable or local variable is a name with a value in the current shell process space % set x=5 % set hwdir=~bobw/cs240/hw4 • We access shell variable value via $name % echo cking variables: $x $hwdir cking variables: 5 /home/bobw/cs240/hw4 % cd $hwdir • To delete the definition for a shell variable % unset x
Display Shell Variables blade64(3)% set _ cat .cshrc addsuffix argv () autologout 60 cwd /home/bobw dirstack /home/bobw echo_style bsd edit exec_prefix /tools/modules-2.2b1 filecomp gid 12 group faculty
Environment Variables • An environment variable is a name with a value that gets communicated from shell to programs running under the shell including other shells • To define an environment variable of your own using the C shell (NOTE: NO = sign): % setenv y 10 % setenv printer lw_office
Environment Variables • Values are accessed the same way as shell vars: % echo $y $printer 10 lw_office % lpr -P$printer *.c • To delete definition for an environment variable % unsetenv y
Display Environment Variables blade64(4)% setenv USER=bobw LOGNAME=bobw HOME=/home/bobw PATH=/tools/req/bin:/groups/ulab/bin:/groups/ulab/pcdev/bin:/home/bobw/bin:/usr/local/bin:/usr/local/hosts:/tools/netscape-4.75:/tools/netscape-4.75/java/classes/java40.jar:/tools/xv/bin:/usr/ucb:/usr/bin:/bin:/usr/local/gnu/bin:/usr/openwin/bin:/usr/dt/bin:/usr/ccs/bin:. MAIL=/var/mail//bobw SHELL=/bin/tcsh
Environment Variables • Accessing environment variables in C programs • To set an environment variable: #include <stdlib.h> int return = putenv(“MY_EV=foobar”); /* if not error, return == 0, otherwise return != 0 */ • To read an environment variable: #include <stdlib.h> char *path = getenv(“MY_EV”);
Forking a child process • Processes can give birth to other processes using the fork() system call (K&R, Chap 8) • Then, there are both a parent and a child process • Typically, the parent keeps track of the child but not vice versa • A common thing for a parent to do is just wait until the child finishes its work and exits by: • returning at level of main ( ) or • executing exit ( )
Forking a child process • Which branch of the “if statement” executes? #include <stdio.h> #include <unistd.h> int main ( ) { int pid; pid = fork(); if (pid) printf("parent process %d forked child %d\n", getpid(), pid); else printf("child process %d from parent %d\n", getpid(), getppid()); return 0; }
Forking a child process • Answer: Both!! blade64(5)% fork child process 29098 from parent 29097 parent process 29097 forked child 29098 blade64(6)% • One branch executes in the parent process and the other executes in the child process
Forking a child shell process • A child shell inherits parent’s environment variables and gets a new clean copy of shell variables (Glass, Figure 3.5) Parent Shell Child Shell Environment Copied from parent Environment Local Local Clean, initialized
Forking a child shell process and program • Fork and execute a new program in child if(fork() == 0) /* child */ { execvp(argv[1], &argv[1]); /* call should not return */ printf("%s\n”, “execvp failed”); } else /* parent */ wait(NULL);
Background Processing • Launch a command in a background (child shell) process using & at the end of the command line: blade64(54)% grep ju junk.c /* junk.c*/ blade64(55)% grep ju junk.c >junk.g & [1] 19913 PID for child process [1] Done grep ju junk.c > junk.g blade64(56)% cat junk.g /* junk.c*/ blade64(57)%