formål: analyser, hvordan processer eller nedlagte processer oprettes, og hvordan man fjerner dem fra procestabellen.
en proces, der er afsluttet, men som stadig har en post i procestabellen. Dette sker for underordnede processer, der er blevet forked af en overordnet proces ved hjælp af systemopkaldet fork()
, men ikke høstet af overordnet proces ved hjælp af systemopkaldet wait()
.
forældreprocessen skal foretage et wait()
(eller waitpid()
) systemopkald for at få udgangsstatus for barneprocessen, når barneprocessen er afsluttet. Hvis wait()
– opkaldet ikke udføres af forældreprocessen, bliver barneprocessen en genvejsproces.
et SIGCHLD
signal sendes til forældreprocessen, når en børneproces afsluttes. Forældreprocessen skal have en SIGCHLD
signalhåndteringsfunktion defineret med et opkald til wait()
– dette fjerner barneprocessen fra procestabellen.
hvis du vil fjerne processer fra et system, kan SIGCHLD
– signalet sendes til forælderen manuelt ved hjælp af kommandoen kill
. Hvis forældreprocessen stadig nægter at høste processen, og hvis forældreprocessen kan dræbes, er det næste trin at dræbe forældreprocessen. Når en børneproces mister sin forældreproces, bliver init
(PID 1) den nye forælder. init
udfører periodisk systemopkaldet wait()
for at høste alle processer med init
som forælder.
jeg skrev et simpelt C-program for at oprette en proces.
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
|
#Inkluder <stdio.h>
#Inkluder <stdlib.h>
#Inkluder <sys / typer.h>
#Inkluder <sys / vent.h>
#Inkluder < unistd.h>
#Medtag <errno.h>
int main ()
{
pid_t child_pid;
int child_status;
child_pid = gaffel ();
if (child_pid > 0) {
// forældreprocessen vil sove i 30 sekunder og afslutte uden et opkald til at vente ()
fprintf (stderr,” forældreproces – %d\n”, getpid());
søvn(30);
Afslut(0);
}
ellers hvis (child_pid == 0) {
// barn proces vil afslutte straks
fprintf(stderr, “barn proces – %d \ n”, getpid());
Afslut(0);
}
ellers hvis (child_pid == -1) {
// gaffel () fejl
perror (“gaffel () opkald mislykkedes”);
Afslut (-1);
}
else {
// dette bør ikke ske
fprintf (stderr, “ukendt returværdi på %d fra gaffel () opkald”, child_pid);
Afslut (-2);
}
tilbage 0;
}
|
Gem ovenstående kode som zombie.c
og kompilere det ved hjælp af gcc
.
$ gcc zombie.c -o zombie
kør derefter programmet.
$ ./zombie parent process - 26570child process - 26571
Fra en anden terminal skal du gøre en ps
for at vise kørende processer. Du kommer til at se en dansk proces.
$ ps -ef | grep zombieibrahim 26570 22886 0 15:59 pts/2 00:00:00 ./zombieibrahim 26571 26570 0 15:59 pts/2 00:00:00 <defunct>
når den overordnede proces er afsluttet (efter 30 sekunder), fjernes processen fra procestabellen ved processen init
.
Mohamed Ibrahim
ibrahim = { interested_in(Android, open_source, reverse_engineering); kodning(C, shell, php, python, java, javascript, nodejs, react); plays_on(PS4); linus_desktop_user(true); }