-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathsignal_handler.c.txt
113 lines (107 loc) · 7.5 KB
/
signal_handler.c.txt
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
┏━━━━━━━━━━━━━━━━━━━━┓
┃ SIGNAL_HANDLER ┃
┗━━━━━━━━━━━━━━━━━━━━┛
SIGNAL HANDLERS ==> #Un asynchronous interrupt handler (dont signal
#handler) doit être une "safe function", c'est-à-dire
#ne pas modifier le contexte du programme qu'il
#interrompt.
#Pour ce faire, s'il prend comme argument des variables
#de ce programme doit donc ne pas les modifier et donc
#les définir en :
# - ou const
# - ou non-const, mais alors :
# - ou passage par valeur
# - ou passage par adresse/référence, mais juste pour
# performance, pas pour modifier
#De plus, les ressources utilisées par le signal handler
#et :
# - non-const dans la fonction interrompue doivent
# être :
# - sig_atomic_t, typedef depuis le plus grand type
# TOUINT étant accédé par une seule instruction
# processeur. L'interruption n'interviendra donc
# pas en plein milieu de l'écriture sur cette
# variable (par exemple l'écriture d'un long long
# int en deux instructions processeurs)
# - volatile, pour être sûr que sig_atomic_t ne sera
# transtypé par optimisation.
# - globales et/ou partagées par plusieurs threads,
# et non-const doivent :
# - utiliser des procédés de synchronization, pour
# éviter qu'un thread interrompe le signal handler
# et corrompe la ressources.
#Et les fonctions qu'il invoque et prenant ses propres
#arguments comme argument doivent être elles-mêmes
#"safe" (cf liste).
#Il doit donc être reentrant + thread-safe.
INTERRUPTION DE #Par ailleurs, la fonction interrompue sera ou reprise
FONCTION ==> #à l'endroit où elle a été interrompue, ou renverra
#une erreur, en fonction des flags passés à sigaction()
#Exceptions :
# - ces fonctions redémarrent toujours :
# - read(), readv(), write(), writev() et ioctl()
# sur un terminal, pipe ou socket n'ayant pas
# encore transférer de data.
# - open() sur une FIFO
# - tous les wait*()
# - accept(), connect(), recv(), recvfrom(),
# recvmsg(), send(), sendto() et sendmsg(), à
# moins qu'un timeout signal ait été envoyé
# - flock() et fcntl() avec F_SETLKW
# - tous les mq*()
# - futex() avec FUTEX_WAIT et tous les sem*()
# - ces fonctions s'interrompent, mais avec un exit
# code de succès :
# - read(), readv(), write(), writev() et ioctl()
# sur un terminal, pipe ou socket ayant déjà
# transférer de data.
# - sleep()
# - ces fonctions renvoient toujours une erreur lors de
# la reprise :
# - accept(), recv(), recvfrom() et recvmsg() avec
# un timeout SO_RCVTIMEO
# - connect(), send(), sendto() et sendmsg(), avec
# un timeout SO_SNDTIMEO
# - Fonctions attendant des signaux : pause(),
# sigsuspend(), sigtimedwait() et sigwaitinfo().
# - epoll_wait(), epoll_pwait(), poll(), ppoll(),
# select() et pselect().
# - msgrcv(), msgsnd(), semop() et semtimedop().
# - clock_nanosleep(), nanosleep() et usleep().
# - read() from an inotify() file descriptor.
# - io_getevents().
SAFE FONCTIONS ==> #Voici la liste :
abort accept access aio_error
aio_return aio_suspend alarm bind
cfgetispeed cfgetospeed cfsetispeed cfsetospeed
chdir chmod chown clock_gettime
close connect creat dup
dup2 execl execle execv
execve _exit _Exit faccessat
fchmod fchmodat fchown fchownat
fcntl fdatasync fexecve fork
fstat fstatat fsync ftruncate
futimens getegid geteuid getgid
getgroups getpeername getpgrp getpid
getppid getsockname getsockopt getuid
kill link linkat listen
lseek lstat mkdir mkdirat
mkfifo mkfifoat mknod mknodat
open openat pause pipe
poll posix_trace_event pselect raise
read readlink readlinkat recv
recvfrom recvmsg rename renameat
rmdir select sem_post send
sendmsg sendto setgid setpgid
setsid setsockopt setuid shutdown
sigaction sigaddset sigdelset sigemptyset
sigfillset sigismember signal sigpause
sigpending sigprocmask sigqueue sigset
sigsuspend sleep sockatmark socket
socketpair stat symlink symlinkat
tcdrain tcflow tcflush tcgetattr
tcgetpgrp tcsendbreak tcsetattr tcsetpgrp
time timer_getoverrun timer_gettime timer_settime
times umask uname unlink
unlinkat utime utimensat utimes
wait waitpid write