(1)* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003

26  Download (0)

Full text

(1)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Contents

1. Preface/Introduction

2. Standardization and Implementation 3. File I/O

4. Standard I/O Library 5. Files and Directories

6. System Data Files and Information 7. Environment of a Unix Process 8. Process Control

9. Signals

10.Inter-process Communication

Signals

ƒ Objectives:

ƒ An overview of signals

ƒ Related function libraries and problems, e.g., reliability & incompatibility.

ƒ What is a signal?

ƒ Software interrupts

ƒ A way of handling asynchronous events

ƒ e.g., SIGABRT, SIGALRM.

ƒ 15 signals for Version 7, 31 signals for SVR4 & 4.3+BSD – <signal.h> (# > 0)

(2)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ Conditions to generate signals:

ƒ Terminal-generated signals – DELETE key, ^c Æ SIGINT

ƒ Signals from hardware exceptions Æ SIGFPE ~ divided-by-0, SIGSEGV ~ illegal memory access, etc.

ƒ Function kill

ƒ Owner or superuser

ƒ Shell command kill, e.g., kill –9 pid

ƒ Signals because of software conditions Æ SIGPIPE ~ reader of the pipe terminated, SIGALRM ~ expiration of an alarm clock

Signals

ƒ The disposition of a signal (the action)

ƒ Ignore signals

ƒ SIGKILL and SIGSTOP can not be ignored.

ƒ There could be undefined behaviors for ignoring signals, such as SIGFPE.

ƒ Catch signals

ƒ Provide a signal handler

ƒ e.g., calling waitpid() when a process receives SIGCHLD

ƒ Apply the default action – Figure 10.1

(3)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ Remark – Figure 10.1

ƒ Terminate w/core – not POSIX.1

ƒNo core file: Non-owner setuid process, non-grp-owner setgid process, no access rights at the working dir, file is too big

(RLIMIT_CORE)

ƒcore.prog

ƒ Hardware faults

ƒImplementation-defined faults

Signals

ƒ SIGABRT – terminate w/core

ƒ Call abort()

ƒ SIGALRM – terminate

ƒ Call setitimer()

ƒ SIGBUS – terminate w/core

ƒ Implementation-defined HW fault

ƒ SIGCHLD – ignore

ƒ It was sent whenever a process terminates or stops

(4)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ SIGCONT – continue/ignore

ƒ Continue a stopped process, e.g., vi

ƒ SIGEMT – terminate w/core

ƒ Implementation-defined HW fault

ƒ SIGFPE – terminate w/core

ƒ Divid-by-0, floating point overflow, etc.

ƒ SIGHUP – terminate

ƒ Disconnection is detected by the terminal interface (no daemons) Æ controlling process of a terminal

ƒ Triggering of the rereading of the config files (daemons)

Signals

ƒ SIGILL – terminate w/core

ƒ Illegal hardware instruction (4.3BSD do it for abort() in the past)

ƒ SIGINFO – ignore (BSD4.3+)

ƒ Status request for fg processes (^T)

ƒ SIGINT – terminate

ƒ DELETE key or ^C

ƒ SIGIO – terminate/ignore

ƒ Indicate an asynchronous I/O event (SIGIO=SIGPOLL, Terminate on SVR4)

(5)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ SIGIOT – terminate w/core

ƒ Implementation-defined HW fault (System V did it for abort() in the past)

ƒ SIGKILL – terminate

ƒ Could not be ignored or caught!

ƒ SIGPIPE – terminate

ƒ reader of the pipe/socket terminated

ƒ SIGPOLL – terminate (SVR4)

ƒ A specific event happens on a pollable device.

Signals

ƒ SIGPROF – terminate

ƒ A profiling timer expires (setitimer)

ƒ SIGPWR – ignore (SVR4)

ƒ System dependent on SVR4

ƒ UPS Æ init shutdowns the system

ƒ SIGQUIT – terminate w/core

ƒ ^\ triggers the terminal driver to send the signal to all foreground processes.

ƒ SIGSEGV – terminate w/core

ƒ Invalid memory access

(6)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ SIGSTOP – stop process (like SIGTSTP)

ƒ Can not be caught or ignored

ƒ SIGSYS – terminate w/core

ƒ Invalid system call

ƒ SIGTERM – terminate

ƒ Termination signal sent by kill command

ƒ SIGTRAP – terminate w/core

ƒ Implementation-defined HW fault

ƒ SIGTSTP – stop process

ƒ Terminal stop signal (^Z) to all foreground processes

Signals

ƒ SIGTTIN – stop process

ƒ Generated when gb processes try to read from the controlling terminal

ƒ SIGTTOU – stop process

ƒ Generated when gb processes try to write to the controlling terminal

ƒ Could be generated by terminal operations, e.g., tcflush

ƒ SIGURG – ignore

ƒ Urgent condition (e.g., receiving of out- of-band data on a network connection)

(7)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signals

ƒ SIGUSR1 – terminate

ƒ User-defined

ƒ SIGUSR2 – terminate

ƒ User-defined

ƒ SIGVTALRM – terminate

ƒ A virtual timer expires (setitimer)

ƒ SIGWINCH – ignore

ƒ Changing of a terminal window size

Signals

ƒ SIGXCPU – terminate w/core

ƒ Exceed the soft CPU time limit

ƒ SIGXFSZ – terminate w/core

ƒ Exceed the soft file size!

(8)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

signal

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

ƒ signo – Figure 10.1

ƒ func: SIG_ING, SIG_DFL, the address of the signal handler/

signal-catching function

ƒSIGKILL & SIGSTOP

ƒ Returned value: the address of the previous handler.

signal

ƒ Remark:

ƒ SVR4: signal function – unreliable signal semantics

ƒ 4.3+BSD: defined in terms of sigaction function – reliable signal semantics

ƒ typedef void Sigfunc(int)

ƒSigfunc *signal(int, sigfunc *);

ƒ Constants:

#define SIG_ERR (void (*)())-1

#define SIG_DFL (void (*)())0

#define SIG_IGN (void (*)())1

(9)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

signal

ƒ Program 10.1 – Page 272

ƒ Program to catch SIGUSR[12]

ƒ Program Start-Up

ƒ All signals are set to their default actions unless some are ignored.

ƒThe exec functions change the

disposition of any signals that are being caught to their default action.

ƒ Fork()

ƒ The shells automatically set the disposition of the interrupt and quit signals of background processes to

“ignored”.

signals

int sig_int();

if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, sig_int);

ƒ Not able to determine the current

disposition of a signal without changing it.

ƒ fork() lets the child inherits the dispositions of the parent!

(10)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Unreliable Signals

ƒ Def: Unreliable Signals

ƒ Signals could get lost!

ƒ Why?

ƒ The action for a signal was reset to its default each time the signal occurred.

ƒ The process could only ignore signals, instead of turning off the signals.

int sig_int();

signal(SIGINT, sig_int);

sig_int() {

signal(SIGINT, sig_int);

… }

?

Unreliable Signals

ƒ Example:

ƒ A process could sleep forever!

ƒ pause() puts the process to sleep until a signal is caught.

int sig_int_flag;

main() {

int sig_int();

signal(SIGINT, sig_int);

while (sig_int_flag == 0) pause();

}

sig_int() {

signal(SIGINT, sig_int);

sig_int_flag = 1; }

?

(11)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Interrupted System Calls

ƒ Traditional Approach

ƒ “Slow” system calls could be interrupted Æ errno = EINTR

ƒ “Slow” System Calls (not disk I/O):

ƒ Reads from or writes to files that can block the caller forever (e.g., pipes, terminal devices, and network devices)

ƒ Opens of files (e.g., terminal device) that block until some conditions occurs.

ƒ pause, wait, certain ioctl operations

ƒ Some IPC functions

Interrupted System Calls

ƒ A typical code sequence

again:

if ((n = read(fd, buff, BUFFSIZE)) < 0) { if (errno == EINTR)

goto again; }

ƒ Restarting of interrupted system calls – since 4.2BSD

ƒ ioctl,read, readv, write, writev, wait, waitpid

ƒ 4.3BSD allows a process to disable the restarting on a per-signal basis.

(12)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Interrupted System Calls

ƒ Figure 10.2 – Page 277

ƒ Summary of signal implementations

ƒ SV & 4.3+BSD: sigaction() with SA_RESTART

ƒ 4.3+BSD: sigvec or sigaction() with SA_RESTART

ƒ Programs 10.12 and 10.13 are implementations of signals with/without restarting.

Reentrant Functions

ƒ Potential Problem:

ƒ In the signal handler, we can’t tell where the process was executing when the signal was caught!

ƒExamples: malloc, getpwnam

ƒOccurrence Time: Anytime, e.g., by timer…

ƒ Figure 10.3 – reentrant functions

ƒ *-marked functions – not in POSIX.1, but in SVR4

(13)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Reentrant Functions

ƒ Non-Reentrant Functions

ƒ Those which use static data structures

ƒ Those which call malloc or free

ƒ Those which are part of the standard I/O library – usage of global data structures

ƒ Restoring of errno inside a handler

ƒ wait() and SIGCHLD

ƒ Updating of a data structure – longjmp()

ƒ Program 10.2 – Page 280

ƒ getpwnam(), SIGALRM, SIGSEGV

SIGCLD Semantics

ƒ SIGCLD (SV) vs SIGCHLD (BSD, POSIX)

ƒ SIGCHLD

ƒHandling is similar to those of other signals.

ƒ SIGCLD: Use signal() or sigset() to set its disposition Æ

ƒThe children of the calling process which sets its disposition to SIG_IGN will not generate zombie processes (not for BSD).

ƒ wait() returns –1 with errno = ECHILD until all children terminate.

(14)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

SIGCLD Semantics

ƒ The kernel checks if there is any child ready to be waited when SIGCLD is set to be caught Æ call SIGCLD handler!

ƒ Program 10.3 – Page 282

ƒ The SIGCLD handler which does not work under SVR2!

ƒ Be aware of any “#define SIGCHLD SIGCLD”

Reliable Signals

ƒ A signal is generated when

ƒ the event that causes the signal occurs!

ƒ A flag is set in the process table.

ƒ A signal is delivered when

ƒ the action for the signal is taken.

ƒ A signal is pending during

ƒ the time between its delivery and generation.

(15)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Reliable Signals

ƒ A signal is blocked until

ƒ the process unblock the signal, or

ƒ The corresponding action become

“ignore”.

ƒ (if the action is either default or a handler)

ƒ A signal mask for each process – sigpromask()

ƒ The system determines which signals are blocked and pending!

ƒ sigpending()

Reliable Signals

ƒ Signals are queued when

ƒ a blocked signal is generated more than once.

ƒ POSIX.1 (but not over many Unix)

ƒ Delivery order of signals

ƒ No order under POSIX.1, but its Rationale states that signals related to the current process state, e.g., SIGSEGV, should be delivered first.

(16)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

kill and raise

#include <sys/types.h>

#include <signal.h>

int kill(pid_t pid, int signo);

int raise(int signo);

ƒ pid > 0 Æ to the process

ƒ pid == 0 Æ to “all” processes with the same gid of the sender (excluding proc 0, 1, 2)

ƒ pid < 0 Æ to “all” processes with gid == |pid|

ƒ pid == -1 Æ broadcast signals under SVR4 and 4.3+BSD

kill and raise

ƒ Right permissions must be applied!

ƒ Superuser is mighty!

ƒ Real or effective uid of the sender ==

that of the receiver

ƒ _POSIX_SAVED_IDS Æ receiver’s saved set-uid is checked up, instead of effective uid

ƒ SIGCONT Æ member of the session

ƒ signo ==0 ~ a null signal

ƒ Normal error checking is performed by kill() to see if a specific process exists.

ƒ kill() returns –1, and errno == ESRCH

(17)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

alarm & pause

#include <unistd.h>

unsigned int alarm(unsigned int secs);

ƒ There could be a delay because of processor scheduling delays.

ƒ A previously registered alarm is replaced by the new value – the left seconds is returned!

ƒ alarm(0) resets the alarm.

ƒ Default: termination

alarm & pause

#include <unistd.h>

int pause(void);

ƒ Return if a signal handler is executed.

ƒReturns –1 with errno = EINTR

ƒ Program 10.4 – Page 286

ƒ Potential problems:

ƒAny previous alarm?

ƒThe lost of the previous SIGALRM handler

ƒA race condition (between alarm() &

pause())

(18)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

alarm & pause

ƒ Program 10.5 – Page 287

ƒ setjmp() inside sleep()

ƒ When a future SIGALRM occurs, the control goes to the right point in sleep2().

ƒ Program 10.6 – Page 288

ƒ SIGALRM interrupts SIGINT handling

ƒ How if SIGALRM interrupts other signal handlers Æ they are aborted!

alarm & pause

ƒ Program 10.7 – Page 289

ƒ Timeout a read (on a “slow” device)!

ƒ A race condition: (between alarm() &

read())

ƒ Automatic restarting of read()?

ƒ No portable way to specifically interrupt a slow system call under POSIX.1.

ƒ Program 10.8 – Page 290

ƒ Timeout & restart a read by longjmp!

ƒ Problems with other signal handlers!

(19)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

Signal Sets

ƒ Why?

ƒ The number of different signals could exceed the number of bits in an integer!

#include <signal.h>

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int sig_no);

int sigdelset(sigset_t *set, int sig_no);

int sigismember(const sigset_t *set, int sig_no);

Signal Sets

ƒ A macro Implementation if # of signals

<= bits in an integer:

#define sigemptyset(ptr) ( *(ptr) = 0)

#define sigfillset(ptr) ( *(ptr) =

~(sigset_t)0, 0)

ƒ Program 10.9

ƒ Not one-line macros because of the checking requirements for validity and the setting of errno under POSIX.1.

(20)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sigprocmask

#include <signal.h>

int sigprocmask(int how, const sigset_t

*set, sigset_t *oset);

ƒ If set is not null, check how SIG_BLOCK, SIG_UNBLOCK,

SIGMASK (Figure 10.4.); otherwise,…

ƒ At least one of the pending, at least one of unblocking signals will be delivered when the sigprocmsk() returns.

ƒ Program 10.10 – Page 294

ƒ Names of signals!

sigpenging

#include <signal.h>

int sigpending(sigset_t *set);

ƒ Returns the set of pending, blocked signals

ƒ Program 10.11 – Page 295

ƒ SIGQUIT is delivered until the signal is blocked and before sigprocmask() returns.

ƒ No queuing of signals.

(21)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sigaction

#include <signal.h>

int sigaction(int signo,

const struct sigaction *act, struct sigaction *oact);

ƒ sa_mask:

sigemptyset(), etc.

ƒ Figure 10.5 – sa_flags

ƒ No queuing of signals

ƒ Unlike signal(), signal handlers remain!

struct sigaction { void (*sa_handler)();

sigset_t sa_mask;

int sa_flags;

};

(including the delivered signal)

sigaction

ƒ Program 10.12 – Page 298

ƒ 4.3+BSD: implement signal using sigaction

ƒ SVR4:

ƒ signal() provides the older, unreliable signal semantics

ƒ Program 10.13 – Page 299

ƒ Prevent any interrupted system calls from being restarted.

(22)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sigsetjmp & siglongjmp

#include <setjmp.h>

int sigsetjmp(sigjmp_buf env, int savemask);

void siglongjmp(sigjmp_buf env, int val);

ƒ sigsetjmp() saves the current signal mask of the process in env if

savemask !=0.

ƒ setjmp & longjmp save/restore the signal mask:

ƒ 4.3+BSD, but not SVR4

sigsetjmp & siglongjmp

ƒ Program 10.14 – Pages 300-301

ƒ sigsetjmp & siglongjmp

ƒRestoring of the signal mask

ƒ_setjmp and _longjmp (4.3+BSD)

ƒ sig_atomic_t – variables of this type could be accessed with a single instruction

ƒno extension across the page boundary

(23)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sigsuspend

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

ƒ Set the signal mask to sigmsk and suspend until a signal is caught or until a signal occurs that

terminates the process.

ƒ Return –1. errno = EINTR if (sigprocmask(…) < 0)

err_sys(…);

pause();

CPU Scheduling could occur!

sigsuspend

ƒ Program 10.15 – Page 304

ƒ When sigsuspend returns, the signal mask is restored.

ƒ Program 10.16 – Page 306

ƒ Setting of a global variable

ƒ Program 10.17 – Pages 307-308

ƒ SIGUSR1: parent Æ child

ƒ SIGUSR2: child Æ parent

(24)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sigsuspend

ƒ How to call other system calls while waiting for a signal to occur?

while (select(…) < 0) { if (errno == EINTR) {

if (alrm_flag)

handle_alrm();

else if (intr_flag) handle_intr();

} else … }

interrupted

Lost signals

Block SIGINT &

SIGALRM Test flags

Call select+unblock as an atomic action

abort

#include <stdlib.h>

void abort(void);

ƒ Sends SIGABRT to the process!

ƒ The SIGABRT won’t return if its handler calls exit, _exit, longjmp, siglongjmp.

ƒ ANSI C requires that if the signal is caught, and the signal handler returns, then abort still doesn’t return to its caller.

ƒ Program 10.18 – Page 11

ƒ POSIX.1 implementation of abort()

(25)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

abort

ƒ ANSI C

ƒThe Implementation determines

whether output streams are flushed and whether temporary files are deleted.

ƒ POSIX.1

ƒPOSIX.1 specifies that abort overrides the blocking or ignoring of the signal by the process.

ƒIf abort() terminates a process, all open standard I/O streams are closed (by fclose()); otherwise, nothing happens.

system

ƒ Program 8.12 – Page 223

ƒ The implementation of system()

ƒ Ignoring of SIGINT and SIGCHLD &

blocking of SIGCHLD (POSIX.2)

ƒ Program 10.19 – Page 312

ƒ Interactive command executed by system()

ƒ Program 10.20 – Pages 314-315

ƒ Setting of a proper signal mask before fork()

ƒ Termination status of the shell

(26)

* All rights reserved, Tei-Wei Kuo, National Taiwan University, 2003.

sleep

#include <unistd.h>

unsigned int sleep(unsigned int secs);

ƒ Suspend until (1) the specified time elapsed, or (2) a signal is caught and the handler returns - returns the unslept seconds.

ƒ Problems:

ƒ alarm(10), 3 secs, sleep(5)?

ƒ Another SIGALRM in 2 seconds? Both SVR4 & 4.3BSD – not POSIX.1

requirements

ƒ Alarm() & sleep() both use SIGALRM.

sleep

ƒ Under SVR4, alarm(6), 3 secs, sleep(5) Æ sleep() returns in 3 secs!

ƒ Program 10.21 – Page 318

ƒ Implementation of sleep()

ƒ Program 10.4 – Page 286

ƒ Unreliable signals!

ƒ No handling of previously set alarms.

Figure

Updating...

References

Related subjects :