-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathOS3.cpp
More file actions
122 lines (89 loc) · 1.7 KB
/
OS3.cpp
File metadata and controls
122 lines (89 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <vector>
#include <fcntl.h>
#include "OS.h"
#include "OS2.h"
#include "OS3.h"
extern int pid;
extern siginfo_t info;
struct job
{
int id;
int status;
};
vector<struct job> jobList;
void kill_sig_handler(int sig)
{
kill(pid,SIGINT);
for (int i=0; i<jobList.size();i++)
{
if (pid==jobList[i].id)
jobList[i].status = TERMINATE;
}
printf("\nThe current process has been killed\n");
}
void stp_sig_handler(int sig)
{
bool check = false;
int sus;
kill(pid,SIGSTOP);
for (int i=0; i<jobList.size();i++)
{
if (pid!=jobList[i].id)
continue;
else
{check = true; jobList[i].status = SUSPEND; sus = i+1; break;}
}
if (check == false)
{
job temp;
temp.id = pid;
temp.status = SUSPEND;
jobList.push_back(temp);
sus = jobList.size();
}
printf("[%d] Suspend\n",sus);
}
void cont(char *arg)
{
int i = atoi(arg);
if (jobList[i-1].status == SUSPEND)
{
kill(jobList[i-1].id,SIGCONT);
pid = jobList[i-1].id;
jobList[i-1].status = RUN;
waitid(P_PID,jobList[i-1].id,&info,WEXITED|WSTOPPED);
if (info.si_code == CLD_STOPPED)
jobList[i-1].status = SUSPEND;
else if (info.si_code == CLD_EXITED || info.si_code == CLD_KILLED)
jobList[i-1].status = TERMINATE;
}
else
printf("Not a suspend job!\n");
}
void printJobs()
{
for (int i=0; i<jobList.size();i++)
{
switch (jobList[i].status)
{
case 1: printf("[%d] Running\n",i+1); break;
case 2: printf("[%d] Suspended\n",i+1); break;
case 3: printf("[%d] Terminated\n",i+1); break;
}
}
}
void printStatus()
{
printf("%d\n",info.si_status);
}
void bg(char *arg)
{
}
void fg(char *arg)
{
}