TWiki
>
CS385 Web
>
Homework7
(2016-10-31, Main.jakob)
(raw view)
E
dit
A
ttach
---++ Implementing signals In this homework, we add support for standard Unix signals to xv6. As in past homeworks, start with the hw8 template from the class repository. Refer to lectures, the text book and Linux man pages, including: [[http://linux.die.net/man/2/sigreturn][man sigreturn]], as well as [[http://www.linuxjournal.com/article/3985][this linuxjournal article]] to learn more about signals. ---+++ alarm() - send SIGALRM to a process after a set interval The template contains a default handler for all signals: kill the process. In this part, we implement a new system call ( =alarm(seconds)=), which sends SIGALRM to the calling process after the specified time interval. The program =alarmtest.c= calls alarm(), then enters an infinite loop. A correct implementation of =alarm()= kills the process after the specified number of seconds. ---+++ signal() step 1 - change the disposition of a signal The =signal()= system call can be used to change the "disposition" of a signal, i.e. how the signal is handled when received. In this step, you need to support only SIG_DFL (=0, default), and SIG_IGN (=1, ignore). The template already has built-in handling for SIG_DFL (kill the process), so you need only support the configuration, and "handle" signals with a SIG_IGN disposition. Test your implementation using =alarmtest2.c=. ---+++ signal() step 2 - user space signal handling functions If the second argument is a function (i.e. a value that is not SIG_DFL or SIG_IGN), then the function passed in should be called when the signal is received. We will follow the Linux design for implementing this, which is described in the linuxjournal article above, and discussed in lecture. *VERY IMPORTANT: the signal handler must run in user mode only* Test your implementation using =alarmtest3.c=. ---+++ Ctrl-C sends SIGINT to the foreground process Implement the system call =fgproc()=, and modify sh.c to use it to track the foreground process. Whenever CTRL-C is pressed, send SIGINT to the foreground process. Test your implementation with =helloloop.c= or any other program that continues running. ---+++ Some hints There are two main things that are challenging in this homework. One isn't a big deal if you're familiar with casting and function pointers, but I suspect dealing with signal handler addresses (and numbers, for the default and ignore actions) is going to pose a basic syntactical challenge for some. The other part is setting up the stack for the signal handler function. You'll want it to look like this, | other stack frames | | a few bytes of machine code to call sys_sigret | | signum parameter for the handler function | | address of the first byte of the code above | You'll want %esp to be pointing at the end of that address by the time you return to userspace (and %eip to the handler function address). As a hint for the machine code bit, the user space symbol "sigret" points at the exact code you need.
E
dit
|
A
ttach
|
P
rint version
|
H
istory
: r6
<
r5
<
r4
<
r3
<
r2
|
B
acklinks
|
V
iew topic
|
Ra
w
edit
|
M
ore topic actions
Topic revision: r6 - 2016-10-31 - 19:36:19 - Main.jakob
CS385.Homework7 moved from CS385.Homework8 on 2016-10-31 - 19:35 by Main.jakob
-
CS385
Syllabus
Lecture Recordings
Piazza
Homeworks
ABOUT US
Our Department
Recent News
Contact Us
ACADEMICS
Prospective Students
Undergraduate
CS Minor
Graduate
Courses
RESEARCH
Overview
By Faculty
Labs
PEOPLE
Faculty
Adjuncts
Staff
Students
Alumni
Copyright 2016 The Board of Trustees
of the University of Illinois.
webmaster@cs.uic.edu
WISEST
Helping Women Faculty Advance
Funded by NSF