Skip to content

Commit 3b8ff40

Browse files
committed
merged-all
1 parent b912ea6 commit 3b8ff40

File tree

9 files changed

+141
-30
lines changed

9 files changed

+141
-30
lines changed

defs.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,14 @@ void wakeup(void*);
124124
void yield(void);
125125
int sendkill(int, int);
126126
int signal(int, sighandler_t);
127-
void check_pending_signal(void);
127+
void check_pending_signal(void);
128128
void stop_handler();
129129
void cont_handler();
130-
void term_handler();
130+
void term_handler(struct proc*);
131131
void handle_signal(struct proc*, int);
132132
void user_handler(struct proc*, int);
133-
int sigret(void);
133+
int sigret(void);
134+
int pause(void);
134135

135136

136137
// swtch.S

proc.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct proc test;
2323
// };
2424

2525
void *p;
26+
int paused = 0;
2627

2728
int nextpid = 1;
2829
extern void forkret(void);
@@ -537,6 +538,7 @@ int
537538
sendkill(int pid, int signum)
538539
{
539540
struct proc *p;
541+
cprintf("sendkill: %d\n", signum);
540542
acquire(&ptable.lock);
541543
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
542544
if(p->pid == pid){
@@ -548,8 +550,19 @@ sendkill(int pid, int signum)
548550
p->psignals[signum] = 1; //For other signals
549551
}
550552
release(&ptable.lock);
551-
if (p->state == SLEEPING && p->killed != 1){
552-
handle_signal(p, signum);
553+
cprintf("paused = %d\n", paused);
554+
if (p->state == SLEEPING){
555+
if(paused == 1 && (signum == SIGTERM || signum == SIGINT || signum == SIGKILL)){
556+
// For processes which are SLEEPING by pause()
557+
paused = 0;
558+
handle_signal(p, SIGCONT);
559+
// Continue the process (to return -1) only when Terminate signals given
560+
}
561+
else if (paused == 0 && p->killed != 1){
562+
// For Stopped process
563+
handle_signal(p, signum);
564+
}
565+
553566
}
554567
return 0;
555568
}
@@ -558,6 +571,16 @@ sendkill(int pid, int signum)
558571
return -1;
559572
}
560573

574+
int
575+
pause()
576+
{
577+
paused = 1;
578+
cprintf("pause: Going to sleep\n");
579+
acquire(&q.lock);
580+
sleep(p, &q.lock);
581+
release(&q.lock);
582+
return -1;
583+
}
561584

562585
int
563586
signal(int signum, sighandler_t handler)
@@ -659,7 +682,7 @@ handle_signal(struct proc *curproc, int i)
659682
case SIGUSR1:
660683
case SIGUSR2:
661684
case SIGVTALRM:
662-
term_handler();
685+
term_handler(curproc);
663686
break;
664687
case SIGCHLD:
665688
case SIGURG:
@@ -699,18 +722,21 @@ check_pending_signal(void)
699722

700723
}
701724

702-
void term_handler()
725+
void term_handler(struct proc *argp)
703726
{
704727
cprintf("in term handler\n");
705-
struct proc *p = myproc();
728+
struct proc *p = argp;
706729
acquire(&ptable.lock);
730+
if(p->state == SLEEPING){
731+
p->state = RUNNABLE;
732+
}
707733
p->killed = 1;
708-
// sched();
709734

710735
// Terminate the process
711736
release(&ptable.lock);
712737
}
713738

739+
714740
void
715741
cont_handler()
716742
{

syscall.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ extern int sys_uptime(void);
106106
extern int sys_sendkill(void);
107107
extern int sys_signal(void);
108108
extern int sys_sigret(void);
109-
109+
extern int sys_pause(void);
110110

111111
static int (*syscalls[])(void) = {
112112
[SYS_fork] sys_fork,
@@ -133,6 +133,7 @@ static int (*syscalls[])(void) = {
133133
[SYS_sendkill] sys_sendkill,
134134
[SYS_signal] sys_signal,
135135
[SYS_sigret] sys_sigret,
136+
[SYS_pause] sys_pause,
136137

137138
};
138139

syscall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@
2323
#define SYS_sendkill 22
2424
#define SYS_signal 23
2525
#define SYS_sigret 24
26+
#define SYS_pause 24

sysproc.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,8 @@ int
117117
sys_sigret(void){
118118
return sigret();
119119
}
120+
121+
int
122+
sys_pause(void){
123+
return pause();
124+
}

testkill.c

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,47 @@ void handler(int signal){
2323

2424

2525
int main(){
26-
int i;
27-
int pid = fork();
28-
if (pid == 0){
29-
signal(SIGTSTP, handler);
30-
sleep(100);
31-
for (i = 0; i < 500; i++){
32-
printf (1, "num - %d\n", i);
26+
// int pid = fork();
27+
28+
// if(pid == 0) {
29+
// sleep(200);
30+
// int i = 0;
31+
// while (1) {
32+
// printf(1,"%d\n",i++);
33+
// }
34+
// }
35+
// else
36+
// {
37+
// for(int i = 0; i < 1; i++){
38+
// sleep(200);
39+
// sendkill(pid, SIGSTOP);
40+
// sleep(200);
41+
// sendkill(pid, SIGCONT);
42+
// }
43+
// sleep(200);
44+
// printf(1, "SIGSTOP Test Passed\n");
45+
// printf(1, "SIGCONT Test Passed\n");
46+
// sendkill(pid, SIGTERM);
47+
// printf(1, "SIGTERM Test Passed\n");
48+
// wait();
49+
// }
50+
int ret = 0;
51+
52+
int pid = fork();
53+
54+
if(pid == 0) {
55+
ret = pause();
56+
if (-1 == ret)
57+
printf(1,"Process exited\n");
58+
}
59+
else
60+
{
61+
printf(1,"Parent\n");
62+
63+
sendkill(pid, SIGTERM);
64+
wait();
3365
}
34-
printf (1, "child over\n");
35-
}
36-
else{
37-
printf (1, "in parent\n");
38-
sleep(200);
39-
// sendkill(pid, SIGCONT);
40-
//sendkill(pid, SIGSTOP);
41-
sendkill(pid, SIGTSTP);
42-
wait();
43-
}
44-
printf (1, "over\n");
45-
exit();
46-
}
66+
67+
68+
exit();
69+
}

user.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ int sleep(int);
2525
int uptime(void);
2626
int sendkill(int, int);
2727
int signal(int, void(*)(int));
28+
int pause(void);
2829

2930
// ulib.c
3031
int stat(const char*, struct stat*);

usertests.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "syscall.h"
88
#include "traps.h"
99
#include "memlayout.h"
10+
#include "signal.h"
1011

1112
char buf[8192];
1213
char name[3];
@@ -1737,6 +1738,56 @@ void argptest()
17371738
printf(1, "arg test passed\n");
17381739
}
17391740

1741+
// Signals Testing
1742+
void signals()
1743+
{
1744+
int i, pid, ret;
1745+
printf(stdout, "signals test\n");
1746+
pid = fork();
1747+
1748+
if(pid == 0) {
1749+
sleep(200);
1750+
i = 0;
1751+
while (1) {
1752+
i++;
1753+
}
1754+
}
1755+
else
1756+
{
1757+
for(i = 0; i < 2; i++){
1758+
sleep(200);
1759+
sendkill(pid, SIGSTOP);
1760+
sleep(200);
1761+
sendkill(pid, SIGCONT);
1762+
}
1763+
sleep(200);
1764+
printf(1, "SIGSTOP Test Passed\n");
1765+
printf(1, "SIGCONT Test Passed\n");
1766+
sendkill(pid, SIGTERM);
1767+
printf(1, "SIGTERM Test Passed\n");
1768+
wait();
1769+
}
1770+
1771+
// pause() testing
1772+
ret = 0;
1773+
pid = fork();
1774+
1775+
if(pid == 0) {
1776+
ret = pause();
1777+
if (-1 == ret)
1778+
printf(1,"Process exited\n");
1779+
}
1780+
else
1781+
{
1782+
printf(1,"Parent\n");
1783+
1784+
sendkill(pid, SIGTERM);
1785+
wait();
1786+
}
1787+
1788+
printf(stdout, "signals test ok\n");
1789+
}
1790+
17401791
unsigned long randstate = 1;
17411792
unsigned int
17421793
rand()
@@ -1756,6 +1807,7 @@ main(int argc, char *argv[])
17561807
}
17571808
close(open("usertests.ran", O_CREATE));
17581809

1810+
signals();
17591811
argptest();
17601812
createdelete();
17611813
linkunlink();

usys.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ SYSCALL(uptime)
3232
SYSCALL(sendkill)
3333
SYSCALL(signal)
3434
SYSCALL(sigret)
35+
SYSCALL(pause)

0 commit comments

Comments
 (0)