0% found this document useful (0 votes)
27 views

14 Ecf Procs

The document discusses exceptional control flow in computer systems. It describes how exceptions allow a change in control flow in response to events, such as hardware interrupts or software faults. Exceptions are handled by exception handlers in the operating system kernel. Asynchronous exceptions are caused by external events while synchronous exceptions occur during instruction execution. System calls are one type of synchronous exception that allow user processes to request services from the operating system kernel.

Uploaded by

akram
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
27 views

14 Ecf Procs

The document discusses exceptional control flow in computer systems. It describes how exceptions allow a change in control flow in response to events, such as hardware interrupts or software faults. Exceptions are handled by exception handlers in the operating system kernel. Asynchronous exceptions are caused by external events while synchronous exceptions occur during instruction execution. System calls are one type of synchronous exception that allow user processes to request services from the operating system kernel.

Uploaded by

akram
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 53

Carnegie Mellon

Exceptional Control Flow:


Exceptions and Processes
15-213 : Introduction to Computer Systems
14th Lecture, Oct. 15, 2015

Instructors:
Randal E. Bryant and David R. O’Hallaron

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 1


Carnegie Mellon

Today
 Exceptional Control Flow
 Exceptions
 Processes
 Process Control

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 2


Carnegie Mellon

Control Flow
 Processors do only one thing:
 From startup to shutdown, a CPU simply reads and executes
(interprets) a sequence of instructions, one at a time
 This sequence is the CPU’s control flow (or flow of control)

Physical control flow


<startup>
inst1
Time inst2
inst3

instn
<shutdown>
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 3
Carnegie Mellon

Altering the Control Flow


 Up to now: two mechanisms for changing control flow:
 Jumps and branches
 Call and return
React to changes in program state

 Insufficient for a useful system:


Difficult to react to changes in system state
 Data arrives from a disk or a network adapter
 Instruction divides by zero
 User hits Ctrl-C at the keyboard
 System timer expires

 System needs mechanisms for “exceptional control flow”

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 4


Carnegie Mellon

Exceptional Control Flow


 Exists at all levels of a computer system
 Low level mechanisms
 1. Exceptions
 Change in control flow in response to a system event
(i.e., change in system state)
 Implemented using combination of hardware and OS software

 Higher level mechanisms


 2. Process context switch
Implemented by OS software and hardware timer

 3. Signals
 Implemented by OS software
 4. Nonlocal jumps: setjmp() and longjmp()
 Implemented by C runtime library

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 5


Carnegie Mellon

Today
 Exceptional Control Flow
 Exceptions
 Processes
 Process Control

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 6


Carnegie Mellon

Exceptions
 An exception is a transfer of control to the OS kernel in response
to some event (i.e., change in processor state)
 Kernel is the memory-resident part of the OS
 Examples of events: Divide by 0, arithmetic overflow, page fault, I/O
request completes, typing Ctrl-C

User code Kernel code

Event I_current Exception


I_next Exception processing
by exception handler
• Return to I_current
• Return to I_next
• Abort

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 7


Carnegie Mellon

Exception Tables
Exception
numbers

Code for  Each type of event has a


exception handler 0 unique exception number k
Exception Code for
Table exception handler 1
0
 k = index into exception table
1
Code for (a.k.a. interrupt vector)
2 exception handler 2
...
n-1 ...  Handler k is called each time
exception k occurs
Code for
exception handler n-1

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 8


Carnegie Mellon

Asynchronous Exceptions (Interrupts)


 Caused by events external to the processor
 Indicated by setting the processor’s interrupt pin
 Handler returns to “next” instruction

 Examples:
 Timer interrupt
Every few ms, an external timer chip triggers an interrupt

 Used by the kernel to take back control from user programs
 I/O interrupt from external device
 Hitting Ctrl-C at the keyboard
 Arrival of a packet from a network
 Arrival of data from a disk

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 9


Carnegie Mellon

Synchronous Exceptions
 Caused by events that occur as a result of executing an
instruction:
 Traps
Intentional

 Examples: system calls, breakpoint traps, special instructions
 Returns control to “next” instruction
 Faults
 Unintentional but possibly recoverable
 Examples: page faults (recoverable), protection faults
(unrecoverable), floating point exceptions
 Either re-executes faulting (“current”) instruction or aborts
 Aborts
 Unintentional and unrecoverable
 Examples: illegal instruction, parity error, machine check
 Aborts current program
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 10
Carnegie Mellon

System Calls
 Each x86-64 system call has a unique ID number
 Examples:
Number Name Description
0 read Read file
1 write Write file
2 open Open file
3 close Close file
4 stat Get info about file
57 fork Create process
59 execve Execute a program
60 _exit Terminate process
62 kill Send signal to process

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 11


Carnegie Mellon

System Call Example: Opening File


 User calls: open(filename, options)
 Calls __open function, which invokes system call instruction syscall

00000000000e5d70 <__open>:
...
e5d79: b8 02 00 00 00 mov $0x2,%eax # open is syscall #2
e5d7e: 0f 05 syscall # Return value in %rax
e5d80: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
...
e5dfa: c3 retq

User code Kernel code  %rax contains syscall number


 Other arguments in %rdi,
syscall Exception %rsi, %rdx, %r10, %r8,
cmp %r9
Open file  Return value in %rax
Returns
 Negative value is an error
corresponding to negative
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition errno 12
Carnegie Mellon

Fault Example: Page Fault int a[1000];


 User writes to memory location main ()
{
 That portion (page) of user’s memory a[500] = 13;
is currently on disk }

80483b7: c7 05 10 9d 04 08 0d movl $0xd,0x8049d10

User code Kernel code

Exception: page fault


movl
Copy page from
disk to memory
Return and
reexecute movl

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 13


Carnegie Mellon

Fault Example: Invalid Memory Reference


int a[1000];
main ()
{
a[5000] = 13;
}

80483b7: c7 05 60 e3 04 08 0d movl $0xd,0x804e360

User code Kernel code

Exception: page fault


movl
Detect invalid address
Signal process

 Sends SIGSEGV signal to user process


 User process exits with “segmentation fault”

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 14


Carnegie Mellon

Today
 Exceptional Control Flow
 Exceptions
 Processes
 Process Control

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 15


Carnegie Mellon

Processes
 Definition: A process is an instance of a running
program.
 One of the most profound ideas in computer science
 Not the same as “program” or “processor”

 Process provides each program with two key


abstractions: Memory
 Logical control flow Stack
Each program seems to have exclusive use of the CPU
 Heap
Data
 Provided by kernel mechanism called context switching
Code
 Private address space
 Each program seems to have exclusive use of main CPU
memory. Registers
 Provided by kernel mechanism called virtual memory

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 16


Carnegie Mellon

Multiprocessing: The Illusion


Memory Memory Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code

CPU CPU CPU


Registers Registers Registers

 Computer runs many processes simultaneously


 Applications for one or more users
Web browsers, email clients, editors, …

 Background tasks
 Monitoring network & I/O devices

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 17


Carnegie Mellon

Multiprocessing Example

 Running program “top” on Mac


 System has 123 processes, 5 of which are active
 Identified by Process ID (PID)
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 18
Carnegie Mellon

Multiprocessing: The (Traditional) Reality


Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code
Saved Saved Saved
registers registers registers

CPU
Registers

 Single processor executes multiple processes concurrently


 Process executions interleaved (multitasking)
 Address spaces managed by virtual memory system (later in course)
 Register values for nonexecuting processes saved in memory
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 19
Carnegie Mellon

Multiprocessing: The (Traditional) Reality


Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code
Saved Saved Saved
registers registers registers

CPU
Registers

 Save current registers in memory

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 20


Carnegie Mellon

Multiprocessing: The (Traditional) Reality


Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code
Saved Saved Saved
registers registers registers

CPU
Registers

 Schedule next process for execution

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 21


Carnegie Mellon

Multiprocessing: The (Traditional) Reality


Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code
Saved Saved Saved
registers registers registers

CPU
Registers

 Load saved registers and switch address space (context switch)

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 22


Carnegie Mellon

Multiprocessing: The (Modern) Reality


Memory
Stack Stack Stack
Heap Heap Heap
Data Data … Data
Code Code Code
Saved Saved Saved
registers registers registers

CPU CPU
 Multicore processors
Registers Registers  Multiple CPUs on single chip
 Share main memory (and some of
the caches)
 Each can execute a separate process
 Scheduling of processors onto
cores done by kernel
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 23
Carnegie Mellon

Concurrent Processes
 Each process is a logical control flow.
 Two processes run concurrently (are concurrent) if their
flows overlap in time
 Otherwise, they are sequential
 Examples (running on single core):
 Concurrent: A & B, A & C
 Sequential: B & C

Process A Process B Process C

Time

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 24


Carnegie Mellon

User View of Concurrent Processes


 Control flows for concurrent processes are physically
disjoint in time

 However, we can think of concurrent processes as running


in parallel with each other

Process A Process B Process C

Time

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 25


Carnegie Mellon

Context Switching
 Processes are managed by a shared chunk of memory-
resident OS code called the kernel
 Important: the kernel is not a separate process, but rather runs as part
of some existing process.
 Control flow passes from one process to another via a
context switch
Process A Process B

user code

kernel code context switch

Time user code

kernel code context switch

user code

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 26


Carnegie Mellon

Today
 Exceptional Control Flow
 Exceptions
 Processes
 Process Control

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 27


Carnegie Mellon

System Call Error Handling


 On error, Linux system-level functions typically return -1 and
set global variable errno to indicate cause.
 Hard and fast rule:
 You must check the return status of every system-level function
 Only exception is the handful of functions that return void
 Example:

if ((pid = fork()) < 0) {


fprintf(stderr, "fork error: %s\n", strerror(errno));
exit(0);
}

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 28


Carnegie Mellon

Error-reporting functions
 Can simplify somewhat using an error-reporting function:
void unix_error(char *msg) /* Unix-style error */
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}

if ((pid = fork()) < 0)


unix_error("fork error");

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 29


Carnegie Mellon

Error-handling Wrappers
 We simplify the code we present to you even further by
using Stevens-style error-handling wrappers:
pid_t Fork(void)
{
pid_t pid;

if ((pid = fork()) < 0)


unix_error("Fork error");
return pid;
}

pid = Fork();

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 30


Carnegie Mellon

Obtaining Process IDs


 pid_t getpid(void)
 Returns PID of current process

 pid_t getppid(void)
 Returns PID of parent process

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 31


Carnegie Mellon

Creating and Terminating Processes


From a programmer’s perspective, we can think of a process
as being in one of three states

 Running
 Process is either executing, or waiting to be executed and will
eventually be scheduled (i.e., chosen to execute) by the kernel

 Stopped
 Process execution is suspended and will not be scheduled until
further notice (next lecture when we study signals)

 Terminated
 Process is stopped permanently

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 32


Carnegie Mellon

Terminating Processes
 Process becomes terminated for one of three reasons:
 Receiving a signal whose default action is to terminate (next
lecture)
 Returning from the main routine
 Calling the exit function

 void exit(int status)


 Terminates with an exit status of status
 Convention: normal return status is 0, nonzero on error
 Another way to explicitly set the exit status is to return an integer
value from the main routine

 exit is called once but never returns.

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 33


Carnegie Mellon

Creating Processes
 Parent process creates a new running child process by
calling fork

 int fork(void)
 Returns 0 to the child process, child’s PID to parent process
 Child is almost identical to parent:
 Child get an identical (but separate) copy of the parent’s virtual
address space.
 Child gets identical copies of the parent’s open file descriptors
 Child has a different PID than the parent

 fork is interesting (and often confusing) because


it is called once but returns twice

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 34


Carnegie Mellon

fork Example
int main()
 Call once, return twice
{
pid_t pid;
 Concurrent execution
int x = 1;  Can’t predict execution
order of parent and child
pid = Fork();
if (pid == 0) { /* Child */  Duplicate but separate
printf("child : x=%d\n", ++x);
exit(0);
address space
}  x has a value of 1 when
fork returns in parent and
/* Parent */
child
printf("parent: x=%d\n", --x);
exit(0);  Subsequent changes to x
} fork.c are independent
 Shared open files
linux> ./fork
parent: x=0  stdout is the same in
child : x=2 both parent and child
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 35
Carnegie Mellon

Modeling fork with Process Graphs


 A process graph is a useful tool for capturing the partial
ordering of statements in a concurrent program:
 Each vertex is the execution of a statement
 a -> b means a happens before b
 Edges can be labeled with current value of variables
 printf vertices can be labeled with output
 Each graph begins with a vertex with no inedges
 Any topological sort of the graph corresponds to a feasible
total ordering.
 Total ordering of vertices where all edges point from left to right

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 36


Carnegie Mellon

Process Graph Example


int main()
{
pid_t pid;
int x = 1;
child: x=2
pid = Fork(); Child
printf exit
if (pid == 0) { /* Child */
printf("child : x=%d\n", ++x); x==1 parent: x=0
Parent
exit(0); main fork printf exit
}

/* Parent */
printf("parent: x=%d\n", --x);
exit(0);
} fork.c

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 37


Carnegie Mellon

Interpreting Process Graphs


 Original graph:
child: x=2
printf exit
x==1 parent: x=0
main fork printf exit

 Relabled graph: Feasible total ordering:


e f

a b e c f d
a b c d

Infeasible total ordering:

a b f c e d
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 38
Carnegie Mellon

fork Example: Two consecutive forks


Bye

void fork2() printf


{ L1 Bye
printf("L0\n"); printf fork printf
fork(); Bye
printf("L1\n"); printf
fork();
L1 Bye
printf("Bye\n"); L0
} forks.c printf fork printf fork printf

Feasible output: Infeasible output:


L0 L0
L1 Bye
Bye L1
Bye Bye
L1 L1
Bye Bye
Bye Bye
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 39
Carnegie Mellon

fork Example: Nested forks in parent


void fork4()
{
printf("L0\n"); Bye Bye
if (fork() != 0) { print printf
printf("L1\n"); L0 f
L1 L2 Bye
if (fork() != 0) { printf fork printf fork printf printf
printf("L2\n");
}
}
printf("Bye\n");
} Feasible output: Infeasible output:
forks.c
L0 L0
L1 Bye
Bye L1
Bye Bye
L2 Bye
Bye L2

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 40


Carnegie Mellon

fork Example: Nested forks in children


void fork5()
{ L2 Bye
printf("L0\n"); printf printf
if (fork() == 0) { L1 Bye
printf("L1\n"); print fork printf
f
if (fork() == 0) { L0 Bye
printf("L2\n"); printf fork printf
}
}
printf("Bye\n"); Feasible output: Infeasible output:
} forks.c L0 L0
Bye Bye
L1 L1
L2 Bye
Bye Bye
Bye L2

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 41


Carnegie Mellon

Reaping Child Processes


 Idea
 When process terminates, it still consumes system resources
Examples: Exit status, various OS tables

 Called a “zombie”
 Living corpse, half alive and half dead
 Reaping
 Performed by parent on terminated child (using wait or waitpid)
 Parent is given exit status information
 Kernel then deletes zombie child process
 What if parent doesn’t reap?
 If any parent terminates without reaping a child, then the orphaned
child will be reaped by init process (pid == 1)
 So, only need explicit reaping in long-running processes
 e.g., shells and servers

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 42


Carnegie Mellon

Zombie
void fork7() {
if (fork() == 0) {
/* Child */

Example printf("Terminating Child, PID = %d\n", getpid());


exit(0);
} else {
printf("Running Parent, PID = %d\n", getpid());
while (1)
; /* Infinite loop */
linux> ./forks 7 & }
[1] 6639 } forks.c
Running Parent, PID = 6639
Terminating Child, PID = 6640
linux> ps
PID TTY TIME CMD
6585 ttyp9 00:00:00 tcsh
6639 ttyp9 00:00:03 forks
 ps shows child process as
6640 ttyp9 00:00:00 forks <defunct> “defunct” (i.e., a zombie)
6641 ttyp9 00:00:00 ps
linux> kill 6639
[1] Terminated
 Killing parent allows child to be
linux> ps reaped by init
PID TTY TIME CMD
6585 ttyp9 00:00:00 tcsh
6642 ttyp9 00:00:00 ps

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 43


Carnegie Mellon

Non-
void fork8()
{
if (fork() == 0) {
terminating /* Child */
printf("Running Child, PID = %d\n",

Child Example getpid());


while (1)
; /* Infinite loop */
} else {
printf("Terminating Parent, PID = %d\n",
getpid());
exit(0);
}
} forks.c
linux> ./forks 8
Terminating Parent, PID = 6675
Running Child, PID = 6676  Child process still active even though
linux> ps parent has terminated
PID TTY TIME CMD
6585 ttyp9 00:00:00 tcsh
6676 ttyp9 00:00:06 forks  Must kill child explicitly, or else will
6677 ttyp9 00:00:00 ps keep running indefinitely
linux> kill 6676
linux> ps
PID TTY TIME CMD
6585 ttyp9 00:00:00 tcsh
6678 ttyp9 00:00:00 ps
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 44
Carnegie Mellon

wait: Synchronizing with Children


 Parent reaps a child by calling the wait function

 int wait(int *child_status)


 Suspends current process until one of its children terminates
 Return value is the pid of the child process that terminated
 If child_status != NULL, then the integer it points to will be set
to a value that indicates reason the child terminated and the exit
status:
 Checked using macros defined in wait.h
– WIFEXITED, WEXITSTATUS, WIFSIGNALED,
WTERMSIG, WIFSTOPPED, WSTOPSIG,
WIFCONTINUED
– See textbook for details

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 45


Carnegie Mellon

wait: Synchronizing with Children


void fork9() {
int child_status;
HC exit
if (fork() == 0) { printf
printf("HC: hello from child\n");
exit(0);
CT
} else {
HP Bye
printf("HP: hello from parent\n");
wait(&child_status); fork printf wait printf
printf("CT: child has terminated\n");
}
printf("Bye\n");
} forks.c

Feasible output: Infeasible output:


HC HP
HP CT
CT Bye
Bye HC
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 46
Carnegie Mellon

Another wait Example


 If multiple children completed, will take in arbitrary order
 Can use macros WIFEXITED and WEXITSTATUS to get information about exit
status

void fork10() {
pid_t pid[N];
int i, child_status;

for (i = 0; i < N; i++)


if ((pid[i] = fork()) == 0) {
exit(100+i); /* Child */
}
for (i = 0; i < N; i++) { /* Parent */
pid_t wpid = wait(&child_status);
if (WIFEXITED(child_status))
printf("Child %d terminated with exit status %d\n",
wpid, WEXITSTATUS(child_status));
else
printf("Child %d terminate abnormally\n", wpid);
}
} forks.c
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 47
Carnegie Mellon

waitpid: Waiting for a Specific Process


 pid_t waitpid(pid_t pid, int &status, int options)
 Suspends current process until specific process terminates
 Various options (see textbook)
void fork11() {
pid_t pid[N];
int i;
int child_status;

for (i = 0; i < N; i++)


if ((pid[i] = fork()) == 0)
exit(100+i); /* Child */
for (i = N-1; i >= 0; i--) {
pid_t wpid = waitpid(pid[i], &child_status, 0);
if (WIFEXITED(child_status))
printf("Child %d terminated with exit status %d\n",
wpid, WEXITSTATUS(child_status));
else
printf("Child %d terminate abnormally\n", wpid);
}
} forks.c
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 48
Carnegie Mellon

execve: Loading and Running Programs


 int execve(char *filename, char *argv[], char *envp[])
 Loads and runs in the current process:
 Executable file filename
Can be object file or script file beginning with #!interpreter

(e.g., #!/bin/bash)
 …with argument list argv
 By convention argv[0]==filename
 …and environment variable list envp
 “name=value” strings (e.g., USER=droh)
 getenv, putenv, printenv
 Overwrites code, data, and stack
 Retains PID, open files and signal context
 Called once and never returns
 …except if there is an error
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 49
Carnegie Mellon

Null-terminated Bottom of stack

Structure of environment variable strings


Null-terminated
the stack when command-line arg strings

a new program envp[n] == NULL


starts envp[n-1]
...
environ
(global var)
envp[0]
envp
argv[argc] = NULL
(in
argv[argc-1] %rdx)
...
argv argv[0]
(in %rsi)

argc Stack frame for


(in %rdi) libc_start_main
Top of stack
Future stack frame for
main

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 50


Carnegie Mellon

execve Example
 Executes “/bin/ls –lt /usr/include” in child process
using current environment:
myargv[argc] = NULL
(argc == 3) myargv[2] “/usr/include”
myargv[1] “-lt”
myargv myargv[0] “/bin/ls”
envp[n] = NULL
envp[n-1] “PWD=/usr/droh”

envp[0] “USER=droh”
environ

if ((pid = Fork()) == 0) { /* Child runs program */


if (execve(myargv[0], myargv, environ) < 0) {
printf("%s: Command not found.\n", myargv[0]);
exit(1);
}
}
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 51
Carnegie Mellon

Summary
 Exceptions
 Events that require nonstandard control flow
 Generated externally (interrupts) or internally (traps and faults)

 Processes
 At any given time, system has multiple active processes
 Only one can execute at a time on a single core, though
 Each process appears to have total control of
processor + private memory space

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 52


Carnegie Mellon

Summary (cont.)
 Spawning processes
 Call fork
 One call, two returns
 Process completion
 Call exit
 One call, no return
 Reaping and waiting for processes
 Call wait or waitpid
 Loading and running programs
 Call execve (or variant)
 One call, (normally) no return

Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition 53

You might also like