-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
136 lines (109 loc) · 2.68 KB
/
main.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
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
// Nombre de processus maximum à gérer
#define NB_PROC 10
// Structure permettant de définir un programme avec des arguments d'exécution
struct program_desc
{
char *file;
char *args[5];
};
// Tableau de la structure enregistrant 3 programmes
struct program_desc programs[] = {
{"firefox", {"http://google.fr", NULL}},
{"gedit", {NULL}},
{"xterm", {"toto.c", NULL}},
};
// Structure qui décrit un processus
struct process_entry
{
pid_t pid; /* PID du processus*/
struct timeval time_sched; /* Temps passé dans l'ordonnanceur*/
struct timeval time_exec; /* Temps total alloué sur le processeur*/
char *file; /* nom de l'exécutable du preocessus */
int exit_status; /* Code d'erreur retourné par le processus */
};
// Prototypes des fonctions
static pid_t process_create(struct program_desc program);
static void process_add(pid_t pid, char* file);
static void process_remove(struct process_entry *entry);
static int process_exited(struct process_entry *entry);
static void scheduler_run(void);
// Variables globales
struct process_entry liste[10];
int listeSize = 0;
// Fonction main
int main (int argc, char **argv)
{
printf("Ordonnanceur\n");
process_create(programs[0]);
process_create(programs[1]);
scheduler_run();
return 0;
}
// Exécute l'un programme en tant que processus fils et l'ajoute à la liste des processus
static pid_t process_create(struct program_desc program)
{
pid_t pid = fork();
switch (pid)
{
/* Si on a une erreur */
case -1:
perror("fork");
return EXIT_FAILURE;
break;
/* Si on est dans le fils */
case 0:
execvp(program.file, program.args);
break;
/* Si on est dans le père */
default:
process_add(pid, program.file);
break;
}
}
// Ajoute un processus à la liste
static void process_add(pid_t pid, char* file)
{
struct process_entry p = {pid, *file};
liste[listeSize] = p;
listeSize++;
}
// Retire un processus de la liste
static void process_remove(struct process_entry *entry)
{
int i;
for(i=0 ; i < NB_PROC-1 ; i++)
{
entry[i] = entry[i+1];
}
struct process_entry empty;
entry[NB_PROC-1] = empty;
listeSize--;
}
// Retourne l'état du processus : en exécution ou terminé
static int process_exited(struct process_entry *entry)
{
int statut = 1;
waitpid(entry->pid, &statut, WNOHANG);
entry->exit_status = statut;
return statut;
}
// Matérialise le code de l'ordonnanceur
static void scheduler_run(void)
{
int continuer = 1;
int i;
while (continuer == 1)
{
for(i=0 ; i <= listeSize ; i++)
{
int retour = process_exited(&liste[i]);
if (retour == 0)
process_remove(&liste[i]);
}
if (listeSize == 0)
continuer = 0;
}
}