-
Notifications
You must be signed in to change notification settings - Fork 0
/
jobs.c
147 lines (135 loc) · 2.52 KB
/
jobs.c
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "header.h"
#include "process_info.h"
extern int number_of_jobs;
extern struct Process proc[100];
void jobs_updated()
{
struct Process dup[100];
int pos = 0;
for(int i = 0; i < number_of_jobs; i += 1)
{
if(kill(proc[i].pid, 0) == -1)
{
continue;
}
dup[pos].pid = proc[i].pid;
dup[pos].name = process_name(proc[i].pid);
dup[pos].stat = proc[i].stat;
pos += 1;
}
for(int i = 0; i < pos; i += 1)
{
proc[i].pid = dup[i].pid;
proc[i].name = dup[i].name;
proc[i].stat = dup[i].stat;
}
number_of_jobs = pos;
}
void status_update(pid_t pid, int status)
{
for(int i = 0; i < number_of_jobs; i += 1)
{
if(proc[i].pid == pid)
{
proc[i].stat = status;
}
}
}
void display_jobs()
{
jobs_updated();
for(int i = 0; i < number_of_jobs; i += 1)
{
printf("[%d] ", (i + 1));
if(WIFEXITED(proc[i].stat))
continue;
else if(WIFSTOPPED(proc[i].stat))
printf("Stopped %s [%d]\n", proc[i].name, proc[i].pid);
else
printf("Running %s [%d]\n", proc[i].name, proc[i].pid);
}
fflush(stdout);
}
void Signal_processes(char *parsed[])
{
for(int i = 0; i <= 2; i += 1)
{
if(parsed[i] == NULL)
{
printf("Invalid number of arguments\nkjob job_num signal\n");
return;
}
}
/*
index [1] followed by signum [2]
*/
char *end;
int index = strtol(parsed[1], &end, 10);
int signum = strtol(parsed[2], &end, 10);
if(index > number_of_jobs || index <= 0)
{
printf("Not a valid job number\n");
return ;
}
pid_t req_pid = proc[index - 1].pid;
if(kill(req_pid, signum) == -1)
{
perror("kill:");
return;
}
jobs_updated();
}
void job_ground(char *parsed[])
{
if(parsed[1] == NULL)
{
printf("Invalid number of arguments\nfd job_num\n");
return ;
}
char *end;
int index = strtol(parsed[1], &end, 10);
if(index > number_of_jobs || index <= 0)
{
printf("Not a valid job number\n");
return ;
}
pid_t req_pid = proc[index - 1].pid;
if(strcmp(parsed[0], "fg") == 0)
{
int wstatus;
signal(SIGTTOU, SIG_IGN);
kill(req_pid, SIGCONT);
int terminal_pid = tcgetpgrp(0);
tcsetpgrp(0, req_pid);
waitpid(req_pid, &wstatus, WUNTRACED);
tcsetpgrp(0, terminal_pid);
signal(SIGTTOU, SIG_DFL);
jobs_updated();
}
else if(strcmp(parsed[0], "bg") == 0)
{
if(kill(req_pid, SIGCONT) == -1)
{
perror("kill:");
return;
}
}
jobs_updated();
}
/*
Kill all the child
processes.
*/
void job_overkill()
{
for(int i = 0; i < number_of_jobs; i += 1)
{
pid_t pid = proc[i].pid;
if(kill(pid, SIGKILL) == -1)
{
perror("kill:");
return;
}
}
jobs_updated();
}