-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathjobs.c
104 lines (85 loc) · 3.92 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
#include "main.h"
// This comapres the 2 structs of jobs array
int comparator(const void *p, const void *q)
{
return strcmp(((job*)p)->jobsNames, ((job*)q)->jobsNames);
}
// This is the function for the command - jobs
void jobs(ll totalArgsInEachCommand, char *listOfArgs[]) {
if(totalArgsInEachCommand > 2) {
printf("Too many arguments!\n");
}
else {
// Sort the array of structs
qsort(myJobsTemp, totalNoOfJobs, sizeof(myJobsTemp[0]), comparator);
// When the input command = jobs
if (totalArgsInEachCommand == 1) {
for(ll i = 0; i < totalNoOfJobs; i++){
if (myJobsTemp[i].jobsStatus == -1)
continue;
char procFile[1000];
sprintf(procFile, "/proc/%lld/stat", myJobsTemp[i].pid);
char status;
FILE *procfd = fopen(procFile, "r");
if (procfd == NULL)
continue;
fscanf(procfd, "%*d %*s %c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d", &status);
fclose(procfd);
printf("[%lld] ",myJobsTemp[i].jobsIndex + 1);
if(status == 'T'){
printf("Stopped ");
}
else{
printf("Running ");
}
printf("%s [%lld]\n", myJobsTemp[i].jobsNames, myJobsTemp[i].pid);
}
} else {
// When the flags are also passed ie -r and -s
// Running
if (strcmp(listOfArgs[1], "-r") == 0) {
for(ll i = 0; i < totalNoOfJobs; i++){
if (myJobsTemp[i].jobsStatus == -1)
continue;
char procFile[1000];
sprintf(procFile, "/proc/%lld/stat", myJobsTemp[i].pid);
char status;
FILE *procfd = fopen(procFile, "r");
if (procfd == NULL)
continue;
fscanf(procfd, "%*d %*s %c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d", &status);
fclose(procfd);
if(status == 'S'){
printf("[%lld] ", myJobsTemp[i].jobsIndex + 1);
printf("Running ");
printf("%s [%lld]\n", myJobsTemp[i].jobsNames, myJobsTemp[i].pid);
}
}
}
// Stopped
else if (strcmp(listOfArgs[1], "-s") == 0) {
for(ll i = 0; i < totalNoOfJobs; i++){
if (myJobsTemp[i].jobsStatus == -1)
continue;
char procFile[1000];
sprintf(procFile, "/proc/%lld/stat", myJobsTemp[i].pid);
char status;
FILE *procfd = fopen(procFile, "r");
if (procfd == NULL)
continue;
fscanf(procfd, "%*d %*s %c %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d", &status);
fclose(procfd);
if(status == 'T'){
printf("[%lld] ", myJobsTemp[i].jobsIndex + 1);
printf("Stopped ");
printf("%s [%lld]\n", myJobsTemp[i].jobsNames, myJobsTemp[i].pid);
}
}
}
else {
// Check error
printf("Invalid arguments!\n");
}
}
}
}