-
Notifications
You must be signed in to change notification settings - Fork 0
/
job.c
105 lines (88 loc) · 2.41 KB
/
job.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
#include "job.h"
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
struct job *new_job(int pid, char **cmd, int cmd_count) {
struct job *job = malloc(sizeof(struct job));
job->pid = pid;
job->cmd = cmd;
job->cmd_count = cmd_count;
return job;
}
void free_job(struct job *job) {
char **jobCmd = job->cmd;
for (int l = 0; l < job->cmd_count; l++) {
free(jobCmd[l]);
}
free(job->cmd);
job->cmd = NULL;
free(job);
job = NULL;
}
struct job_node *new_job_node(struct job *job) {
struct job_node *jobList = (struct job_node *) malloc(sizeof(struct job_node));
jobList->next = NULL;
jobList->job = job;
return jobList;
}
void free_job_node(struct job_node *node) {
free_job(node->job);
free(node);
node = NULL;
}
void add_job(struct job_node *head, struct job *job) {
struct job_node *current = head;
struct job_node *newNode = new_job_node(job);
while (current->next) {
current = current->next;
}
current->next = newNode;
}
void remove_job(struct job_node *head, struct job_node *job_node) {
struct job_node *current = head;
struct job_node *prev = NULL;
while (current->next) {
prev = current;
current = current->next;
if (current == job_node) {
if (current->next) {
prev->next = current->next;
} else {
prev->next = NULL;
}
free_job_node(current);
return;
}
}
}
void remove_jobs(struct job_node *head) {
printf("Job list : \n");
struct job_node *current = head;
while (current->next) {
current = current->next;
struct job *job = current->job;
printf("%d ", job->pid);
char **jobCmd = job->cmd;
for (int l = 0; l < job->cmd_count; l++) {
printf("%s ", jobCmd[l]);
}
int status;
pid_t result = waitpid(job->pid, &status, WNOHANG);
if (result == 0) {
printf("alive");
} else if (result == -1) {
if (errno == ECHILD) {
perror("Error ECHILD!!");
} else if (errno == EINTR) {
perror("Error EINTR!!");
} else {
perror(" Error EINVAL!!");
}
} else {
printf("exited");
remove_job(head, current);
}
printf("\n");
}
}