/
jobs_signals.c
53 lines (43 loc) · 1.46 KB
/
jobs_signals.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
#include "minishell.h"
#include "jobs.h"
#include "terminal.h"
bool builtin_waiting;
void handler_sigint (int sig) {
if (builtin_waiting) {
terminal_printf("\n"); // Retour a la ligne après le symbole de controle
builtin_waiting = false;
}
}
void handler_sigchld (int sig) {
pid_t pid;
int status;
while ((pid = waitpid(-1, &status, WNOHANG | WCONTINUED | WUNTRACED)) > 0) {
jobid_t jobid = jobs_find_by_pid(pid);
if (jobid == INVALID_JOBID) {
printf("Got a SIGCHLD for child with pid %d, but no corresponding job found\n", pid);
continue;
}
// On indique que le status du job doit être mise à jour
job_update(jobid, status);
}
}
sigset_t signals_to_block;
// Initialise la gestion des signaux utilisées par le shell
// (assigne les handlers et prépare les bloquages)
void jobs_signals_init () {
Signal(SIGCHLD, handler_sigchld);
Signal(SIGINT, handler_sigint);
Signal(SIGTSTP, SIG_IGN);
Sigemptyset(&signals_to_block);
Sigaddset(&signals_to_block, SIGCHLD);
}
// Bloque les signaux importants pour le shell s'ils ne sont
// pas déjà bloqués
void jobs_signals_lock (char* desc) {
Sigprocmask(SIG_BLOCK, &signals_to_block, NULL);
}
// Débloque les signaux importants pour le shell s'ils ont
// été bloqués au préalable par un appel à `signals_lock`
void jobs_signals_unlock (char* desc) {
Sigprocmask(SIG_UNBLOCK, &signals_to_block, NULL);
}