csce 510 - systems programming lect. 12-advanced shell impl. topics csce 510 feb 25, 2013

39
CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Upload: alexander-lawson

Post on 05-Jan-2016

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

CSCE 510 - Systems

Programming

Lect. 12-Advanced Shell Impl. Topics

CSCE 510 Feb 25, 2013

Page 2: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Overview

Last Time Sigaction again Setsets, sigmasks Blocking signals Inheriting signal masks

Test Closed Book

Function signatures, DS: stat, sigact, ??? Notes sheet – 1 side 8.5x11

handwritting pencil or blue ink

Take-home % ? Old Tests: CPP, UFS,

Today Last time: File Systems –

Chap 18 Shell1 - Program More signals:

graceful exit “restart” as in shell

Multiple Pipes Job Control Terminal input char by

char (not line) Configure Automake

Page 3: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -3 Advanced Shell Implementation

SIGACTION(2) Linux Programmer's Manual SIGACTION(2)

NAME sigaction - examine and change a signal action

SYNOPSIS #include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

Page 4: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Sigaction structure

- CSCE 510 2013 -4 Advanced Shell Implementation

struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };On some architectures a union is involved: do not assign to both sa_handler and sa_sigaction.

Page 5: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -Slide - 5 - Advanced Shell Impl.

SA_NOCLDSTOP If signum is SIGCHLD, do not receive notification when child

processes stop SA_NOCLDWAIT (Since Linux 2.6)

If signum is SIGCHLD, do not transform children into zombies when they terminate.

SA_NODEFER Do not prevent the signal from being received from within

its own signal handler. SA_ONSTACK

Call the signal handler on an alternate signal stack provided by sigaltstack(2).

Page 6: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -Slide - 6 - Advanced Shell Impl.

SA_RESETHAND Restore the signal action to the default state once the sigâ[m nal handler has been called. This flag is only meaningful when establishing a signal handler. SA_ONESHOT is an obsoâ[m lete, non-standard synonym for this flag.SA_RESTART Provide behavior compatible with BSD signal semantics by making certain system calls restartable across signals. This flag is only meaningful when establishing a signal hanâ[m dler. See signal(7) for a discussion of system call restarting.

SA_SIGINFO (since Linux 2.2) The signal handler takes 3 arguments, not one. In this case, sa_sigaction should be set instead of sa_handler. This flag is only meaningful when establishing a signal hanâ[m dler.

Page 7: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/abort.c

- CSCE 510 2013 -7 Advanced Shell Implementation

voidabort(void) /* POSIX-style abort() function */{ sigset_t mask; struct sigaction action; /* caller can't ignore SIGABRT, if so reset to default */ sigaction(SIGABRT, NULL, &action); if (action.sa_handler == SIG_IGN) { action.sa_handler = SIG_DFL; sigaction(SIGABRT, &action, NULL); } if (action.sa_handler == SIG_DFL) fflush(NULL); /* flush all open stdio streams */ /* caller can't block SIGABRT; make sure it's unblocked */ sigfillset(&mask); sigdelset(&mask, SIGABRT); /* mask has only SIGABRT turned off */ sigprocmask(SIG_SETMASK, &mask, NULL);

Page 8: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/abort.c

- CSCE 510 2013 -Slide - 8 - Advanced Shell Impl.

kill(getpid(), SIGABRT); /* send the signal */

/* if we're here, process caught SIGABRT and returned */ fflush(NULL); /* flush all open stdio streams */

action.sa_handler = SIG_DFL; sigaction(SIGABRT, &action, NULL); /* reset disposition to default */ sigprocmask(SIG_SETMASK, &mask, NULL); /*just in case ... */

kill(getpid(), SIGABRT); /* and one more time */

exit(1); /* this should never be executed ... */

}

Page 9: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/system.c

- CSCE 510 2013 -Slide - 9 - Advanced Shell Impl.

#include <sys/types.h>#include <sys/wait.h>#include <errno.h>#include <signal.h>#include <unistd.h>

intsystem(const char *cmdstring) /* with appropriate signal handling */{ pid_t pid; int status; struct sigaction ignore, saveintr, savequit; sigset_t chldmask, savemask;

if (cmdstring == NULL) return(1); /* always a command processor with Unix */

Page 10: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/system.c

- CSCE 510 2013 -Slide - 10 - Advanced Shell Impl.

ignore.sa_handler = SIG_IGN; /*ignore SIGINT and SIGQUIT */sigemptyset(&ignore.sa_mask);ignore.sa_flags = 0;if (sigaction(SIGINT, &ignore, &saveintr) < 0) return(-1); if (sigaction(SIGQUIT, &ignore, &savequit) < 0) return(-1);sigemptyset(&chldmask); /* now block SIGCHLD */sigaddset(&chldmask, SIGCHLD);if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0) return(-1);

Page 11: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/system.c

- CSCE 510 2013 -Slide - 11 - Advanced Shell Impl.

if ( (pid = fork()) < 0) { status = -1; /* probably out of processes */

} else if (pid == 0) { /* child */ /* restore previous signal actions & reset signal mask */ sigaction(SIGINT, &saveintr, NULL); sigaction(SIGQUIT, &savequit, NULL); sigprocmask(SIG_SETMASK, &savemask, NULL);

execl("/bin/sh", "sh", "-c", cmdstring, (char *) 0); _exit(127); /* exec error */ } else { /* parent */

Page 12: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

APUE/system.c

- CSCE 510 2013 -Slide - 12 - Advanced Shell Impl.

} else { /* parent */ while (waitpid(pid, &status, 0) < 0) if (errno != EINTR) { status = -1; /* error other than EINTR from waitpid() */ break; } }if (sigaction(SIGINT, &saveintr, NULL) < 0) /* restore previous signal actions */ return(-1); /*& reset signal mask */ if (sigaction(SIGQUIT, &savequit, NULL) < 0) return(-1); if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0) return(-1);

return(status);}

Page 13: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -Slide - 13 - Advanced Shell Impl.

ALARM(2) Linux Programmer's Manual ALARM(2)

NAME alarm - set an alarm clock for delivery of a signal

SYNOPSIS #include <unistd.h>

unsigned int alarm(unsigned int seconds);

DESCRIPTION alarm() arranges for a SIGALRM signal to be delivered to the calling process in seconds seconds.…sleep(3) may be implemented using SIGALRM; mixing calls to alarm() and sleep(3) is a bad idea.

Page 14: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

When would you set an alarm?

- CSCE 510 2013 -Slide - 14 - Advanced Shell Impl.

Page 15: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Shell1 program

- CSCE 510 2013 -Slide - 15 - Sigaction/Longjmp

email Popquiz .myshrc examples Question on set/

10% extra credit tonight 5% penalty due Sunday

Page 16: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Last Time – Things we did/didn’t get to

- CSCE 510 2013 -Slide - 16 - Sigaction/Longjmp

Code we looked at Examples/ code

zombie.c zombie2.c sigmask0.c popen.c

TLPI/procexec/ code fork_whos_on_first.c system.c

What we had to skip TLPI/procexec/multi_wait.c TLPI/proc/longjmp.c

Filesystems Fig 14-1 partition layout Fig 14-2 file structure

Page 17: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Advanced Shell Implementation

- CSCE 510 2013 -Slide - 17 - Advanced Shell Impl.

Multiple Pipes ls –lrt | grep “^d” | wc

Job Control background Cntl-Z to terminal handler sends SIGSTOP to foreground process bg – moves stopped job to background

Terminal input char by char (not line)

Page 18: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

More signals

- CSCE 510 2013 -Slide - 18 - Advanced Shell Impl.

Catch signal graceful exit catch signal longjmp to spot to flush buffer, close open fd

Catch signal and restart - consider a shell; what should it do when a SIGINT is received?

Page 19: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Examples/graceful.c (note old sigs)

- CSCE 510 2013 -Slide - 19 - Advanced Shell Impl.

Should be updated to sigaction!!!#include <stdio.h>#include <signal.h>

main(){

int onint(int); /* SIGINT handler */ int i;

signal(SIGINT, (void *) onint); signal(SIGQUIT, (void *) onint);

for(i=0; ;i++) fprintf(stdout,"%d\n",i); }

intonint(int sig){ fprintf(stderr,"Received SIG=%d\n", sig); fprintf(stdout,"Received SIG=%d\n", sig); /* * Graceful exit type things removing temporary files, flushing buffers etc. * */

Page 20: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Graceful Exit with sigaction

- CSCE 510 2013 -20 Advanced Shell Implementation

onintr as before

Page 21: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Catch Signals and Start Over

- CSCE 510 2013 -21 Advanced Shell Implementation

Page 22: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

TLPI/*.c

- CSCE 510 2013 -Slide - 22 - Advanced Shell Impl.

catch_rtsigs.c sigmask_longjmp.c cond

compilation sigsetjmp t_kill.c - kill implemnation demo_SIGFPE.c –div by 0

signal.c t_sigaltstack.c ignore_pending_sig.c signalfd_sigval.c t_sigqueue.c

intquit.c signal_functions.c t_sigsuspend.c nonreentrant.c sig_receiver.c t_sigwaitinfo.c ouch.c sig_sender.c siginterrupt.c sig_speed_sigsuspend.c

Page 23: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

First pipe remapping review ls|wc

- CSCE 510 2013 -Slide - 23 - Advanced Shell Impl.

Pipes system maintained buffer for communication between processes int pipe (int fd[2]); pipesize = buffer size in limits.h remember kernel automatically does synchronization

pipe-full writer has to wait pipe-empty reader has to wait

ls | wc pipe(pfd) fork read side write side

Page 24: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Multipipes implementation

- CSCE 510 2013 -Slide - 24 - Advanced Shell Impl.

ls –l –r –t | grep “^d” | wc How many processes? (include shell)

How many forks?

Who should quit first?

Who is the child of the shell?

Page 25: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Multipipes pseudo code sheet

- CSCE 510 2013 -Slide - 25 - Advanced Shell Impl.

ls | grep “^d” | wc // after substitutions

lastPipe=NULL for(p=cmd; p != NULL; p = p->next){

if ( strcmp(p->word, “|”) == 0){ lastPipe = p; }

Now break into two cmds; one without any pipes (cmd1)

nextword

cmd

“ls”

nextword

“|”

nextword

“grep”

nextword

“^d”

nextword

“|”

nextword

“wc”

λ

Page 26: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -Slide - 26 - Advanced Shell Impl.

then1. What if lastPipe == NULL?2. cmd1 = lastPipe->next3. End cmd; lastPipe-> previous -> 4. pipe and fork5. in parent remap stdin; execute cmd16. in child remap stdout; recursively

exec_cmd_with_pipes(cmd)

nextword

cmd

“ls”

nextword

“|”

nextword

“grep”

nextword

“^d”

nextword

“|”

nextword

“wc”

λ

lastPipe

Page 27: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

MultiplePipes: The Process Picture

- CSCE 510 2013 -Slide - 27 - Advanced Shell Impl.

cmd – original command truncated at lastPipe cmd – cmd from lastPipe->next on (no pipes in this)

pipe(pfd)fork()

exec(cmd1) exec_cmd_with_pipes(cmd)

Page 28: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

MultiplePipes: fill in the code

- CSCE 510 2013 -Slide - 28 - Advanced Shell Impl.

cmd – original truncated at lastPipe cmd – cmd from lastPipe->next on } else { /*Pipe joining cmd and cmd1 */ if(pipe(pfd) < 0)

fatal("Mysh can't create pipe"); if((pid = fork()) < 0)

fatal("Mysh Can't fork"); if (pid == 0){ /* P2 code */ - close stdout

- map stdout to the pipe

- close extra fd

- recursive call

cmd – original command truncated at lastPipe

} else { /* P1 Code */ - close stdin

- map stdin to the pipe (dup pfd[0])

- close extra fd

- exec cmd1 after putting in argv form

}

Page 29: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Job Control

- CSCE 510 2013 -29 Advanced Shell Implementation

^Z sends SIGSTOP

Page 30: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Terminal I/O

- CSCE 510 2013 -Slide - 30 - Advanced Shell Impl.

Fig 62-1 stty stty noecho

Page 31: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Terminal I/O

- CSCE 510 2013 -31 Advanced Shell Implementation

Typical input from keyboard is line buffered by terminal handler nothing input buffered till you type ‘\n’

Vi, less, Shells - character by character processing allowing up arrow and other arrows

Chapter 62 stty: canonical mode cbreak and raw mode (table 62-3)

Page 32: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Canonical Mode

- CSCE 510 2013 -Slide - 32 - Advanced Shell Impl.

input line-buffered if read requests less bytes remaining data saved for next

read

^D (EOT ) causes read to return EOF

line editing is enabled ERASE backspace/delete KILL ^U

Page 33: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Noncanonical Mode

- CSCE 510 2013 -Slide - 33 - Advanced Shell Impl.

MIN=0, TIME==0 (polling read)

MIN > 0, TIME==0 (blocking read)

MIN == 0, TIME>0 (read with timeout)

MIN > 0, TIME>0 (read with interbyte timeout)

Page 34: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Cooked, Raw, Cbreak

- CSCE 510 2013 -Slide - 34 - Advanced Shell Impl.

Table 62-3Feature Cooked Cbreak Raw

Input available line by line char by char char by char

Line editing? Yes No No

Signal generating chars interpreted? Yes Yes No

START/STOP interpreted? Yes Yes No

Other special chars interpreted? Yes No No

Other input processing? Yes Yes No

Other output processing? Yes Yes No

Input echoed? Yes maybe No

Page 35: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

- CSCE 510 2013 -Slide - 35 - Advanced Shell Impl.

TERMIOS(3) Linux Programmer's Manual TERMIOS(3)

NAME termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed - get and set terminal attributes, line control, get and set baud rate

SYNOPSIS #include <termios.h> #include <unistd.h>

int tcgetattr(int fd, struct termios *termios_p);

int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);

Page 36: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

TLPI/tty

- CSCE 510 2013 -Slide - 36 - Advanced Shell Impl.

ls tty/*.cdemo_SIGWINCH.c no_echo.c tty_functions.cnew_intr.c test_tty_functions.c ttyname.c

Page 37: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Configure / Automake

- CSCE 510 2013 -Slide - 37 - Advanced Shell Impl.

download unpack

gunzip make* tar xvf make.tar

configure make

Configure sh scriptfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATHdo IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist,

# to save several forks. as_shell=$as_dir/$as_base

Page 38: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Review for test – old test emailed

- CSCE 510 2013 -Slide - 38 - Sigaction/Longjmp

Class Date Day Topic System Calls ReadingLabs/Case Studies

1 14-Jan MonOverview: history, uid/gid,permissions chmod printargs.c

2 16-Jan WedSystem Calls: /proc, I/O, stat struct

open, read,write,close, fork, opendir, readdir

21-Jan Mon Martin Luther King Day

3 23-Jan Wed StatSysCall: reentrant, inode table, stat, fstat, lstat, I/O, lseek Chap 4

4 28-Jan Mon Ar, File I/O again, holesdup, dup2, fcntl, truncate, tmpfile(3) Chap 5

5 30-Jan WedProcesses, Memory Layout, Environment

getpid, getenv(3), Setjmp / longjmp, malloc Chap 6,7,8,9

6 4-Feb Mon Java2C, Memory, Time: gdb, printf string(3), brk, malloc impl, time tree.c, gdb

7 6-Feb Wed Make, Stdio, I/O Buffering vfork, wait, execve, getconf Chap 24, 12

8 11-Feb Mon I/O buffering, Shells: /proc, stdioExec family, ps(1), stdio(3), setvbuf(3) Chap 12,13

9 13-Feb Wed Shells, pipes truncate again, strtok(3),pipe Chap 3, 44 2-Shell Prog

10 18-Feb Mon Signals, GNU Coding Standards:hsearch(3), pipe, exec(3), signal, sigaction

Chap 20, 21, GNU

11 20-Feb Wed Longjmps; File Systems setjmp, longjmpChap 21,22,18

Page 39: CSCE 510 - Systems Programming Lect. 12-Advanced Shell Impl. Topics CSCE 510 Feb 25, 2013

Test

- CSCE 510 2013 -Slide - 39 - Sigaction/Longjmp