NAVN
- Provided by: manpages-da-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
C-standardbibliotek (libc, -lc)
#include <sys/wait.h>
pid_t wait(int *_Nullable wstatus); pid_t waitpid(pid_t pid, int *_Nullable wstatus, int tilvalg);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
/* Dette er glibc- og POSIX-grænsefladen; se
VERSIONS for information om det rå systemkald. */
waitid():
Siden glibc 2.26:
_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L
glibc 2.25 og tidligere:
_XOPEN_SOURCE
|| /* Siden glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc <= 2.19: */ _BSD_SOURCE
Alle disse systemkald bruges til at vente på tilstandsændringer i en underproces af den kaldende proces, og hente information om underprocessen, hvis tilstand har ændret sig. En tilstandsændring anses for at være: underprocessen afsluttedes; underprocessen blev stoppet af et signal; eller underprocessen blev genoptaget af et signal. I tilfældet med en afsluttet underproces vil udførelse af en wait gøre det muligt for systemet at frigive ressourcerne associeret med underprocessen; hvis en wait ikke udføres, så bliver den afsluttede underproces i en »zombie«-tilstand (se NOTES nedenfor).
Hvis en underproces allerede har ændret tilstand, så returneres disse kald øjeblikkeligt. ellers blokerer de indtil en underproces ændrer tilstand eller en signalhåndtering afbryder kaldet (under antagelse af at systemkaldene ikke automatisk genstartes via flaget SA_RESTART for sigaction(2)). På resten af denne side vil en underproces, hvis tilstand har ændret sig og endnu ikke har modtaget en wait af et af disse systemkald blive kaldt for waitable.
Systemkaldet wait() suspenderer afviklingen af den kaldende tråd indtil en af dens underprocesser afsluttes. Kaldet wait(&wstatus) svarer til:
waitpid(-1, &wstatus, 0);
Systemkaldet waitpid() suspenderer afviklingen af den kaldende tråd indtil en underproces angivet af argumentet pid har ændret tilstand. Som standard venter waitpid() kun på afsluttede underprocesser, men denne opførsel kan ændres via argumentet options, som beskrevet nedenfor.
Værdien af pid kan være:
Værdien af tilvalg er en OR af nul eller flere af de følgende konstanter:
(For tilvalg kun for Linux, se nedenfor).
Hvis wstatus er NULL så lagrer wait() og waitpid() statusinformation i den int der peges på. Dette heltal kan inspiceres med de følgende makroer (der bruger selve heltallet som et argument, ikke en tekstsøger, som det gøres i wait() og waitpid()!):
Systemkaldet waitid() (tilgængelig siden Linux 2.6.9) tilbyder mere præcis kontrol over hvilke tilstandændringer for underprocesser, der skal ventes på.
Argumenterne idtype og id vælger underprocesserne, der skal ventes på, som følgende:
Underprocestilstanden ændres til vent på er angivet af ORing en eller flere af de følgende flag i options:
De følgende flag kan yderligere blive ORed i options:
Ved succesfuld returnering udfylder waitid() de følgende felter i strukturen siginfo_t peget mod af infop:
Hvis WNOHANG blev angivet i tilvalg og der ingen underprocesser var i en ventende tilstand, så returnerer waitid() 0 øjeblikkeligt og tilstanden for strukturen siginfo_t pegende mod infop afhænger af implementeringen. For (flytbart) at skelne dette tilfælde fra hvor en underproces var i en ventende tilstand, nulstil feltet si_pid før kaldet og tjek for en værdi forskellig fra nul i dettte felt efter kaldet returnerer.
POSIX.1-2008 Technical Corrigendum 1 (2013) tilføjer kravet at når WNOHANG er angivet i tilvalg og der er ingen underproces i en ventende tilstand, så bør waitid() nulstille felterne si_pid og si_signo for strukturen. På Linux og andre implementeringer, der overholder dette krav, er det ikke nødvendigt at nulstille feltet si_pid før waitid() kaldes. Alle implementeringer følger dog ikke POSIX.1-specifikationen på dette tidspunkt.
wait(): ved succes, returneres proces-id'et for den afsluttede underproces; ved fejl returneres -1.
waitpid(): ved succes returneres proces-id'et for underprocessen hvis tilstand har ændret sig; hvis WNOHANG blev angivet og en eller flere underprocesser angivet af pid findes, men endnu ikke har ændret tilstand, så returneres 0. Ved fejl returneres -1.
waitid(): returnerer 0 ved succes eller hvis WNOHANG var angivet og ingen underproces angivet af id endnu ikke har ændret tilstand; ved fejl returneres -1.
Ved fejl, angiver hvert af disse kald errno for at indikere fejlen.
wait() er faktisk en biblioteksfunktion der (i glibc) er implementeret som et kald til wait4(2).
På nogle arkitekturer er det intet waitpid()-systemkald; i stedet for er denne grænseflade implementeret via en C-biblioteksomslagsfunktion, der kalder wait4(2).
Det rå systemkald waitid() anvender et femte argument, af typen struct rusage *. Hvis dette argument er forskellig fra NULL, så bruges det til at returnere information om ressourceforbrug for underprocessen, på samme måde som wait4(2). Se getrusage(2) for detaljer.
POSIX.1-2024.
SVr4, 4.3BSD, POSIX.1-2001.
En underproces der afsluttes, men der ikke er blevet ventet på bliver en »zombie«. Kernen vedligeholder et minimum af information om zombieprocessen (PID, afslutningsstatus, information om ressourceforbrug) for at overprocessen senere kan udføre en wait for at få information om underprocessen. Så længe en zombie ikke fjernes fra systemet via en wait, så vil den bruge en plads i kerneprocestabellen og hvis denne tabel bliver fyldt, så vil der ikke længere kunne oprettes yderligere processer. Hvis en overproces afsluttes, så bliver dens (hvis nogen) »zombieprocesser« adopteret af init(1), (eller af den nærmeste »subreaper«-proces som defineret via brugen af prctl(2) PR_SET_CHILD_SUBREAPER-operationen); init(1) udfører automatisk en wait for at fjerne zombierne.
POSIX.1-2001 angiver at hvis dispositionen af SIGCHLD er angivet til SIG_IGN eller flaget SA_NOCLDWAIT er angivet for SIGCHLD (se sigaction(2)), så bliver underprocessen, der afsluttes, ikke en zombie og et kald til wait() eller waitpid() vil blokere indtil alle underprocesser er afsluttet, og så fejle med errno angivet til ECHILD. (Den oprindelige POSIX-standard efterlod opførelsen med at angive SIGCHLD til SIG_IGN uspecificeret. Bemærk at selvom standarddispositionen for SIGCHLD er »ignore« (ignorer), så medfører eksplicit angivelse af dispositionen til SIG_IGN forskellig behandling af zombieunderprocesser).
Linux 2.6 overholder POSIX-kravene. Linux 2.4 (og tidligere) gør dog ikke: hvis et wait()- eller waitpid()-kald laves mens SIGCHLD bliver ignoreret, så opfører kaldet sig som at SIGCHLD ikke blev ignoreret, det vil sige, kaldet blokeres indtil den næste underproces afsluttes og returnerer så proces-id'et og status for den underproces.
I Linuxkernen er en kerneplanlagt tråd ikke en distinkt konstruktion fra en proces. I stedet er en tråd bare en proces, der oprettes via det Linux-unikke systemkald clone(2); andre rutiner såsom det flytbare kald pthread_create(3) implementeres via clone(2). Før Linux 2.4 var en tråd bare en speciel proces og som konsekvens kunne en tråd ikke vente på underprocessen i en anden tråd, selv om den sidstnævnte tilhører den samme trådgruppe. POSIX foreskriver dog sådan funktionalitet, og siden Linux 2.4 kan en tråd, og vil som standard, vente på underprocesser i andre tråde i den samme trådgruppe.
De følgende Linux-specifikke tilvalg er for brug med underproces oprettet via clone(2); de kan også, siden Linux 4.7, bruges med waitid():
Siden Linux 4.7, antages flaget __WALL automatisk hvis underprocessen bliver ptraced.
Jævnfør POSIX.1-2008 skal et program der kalder waitid() sikre at infop peger på en siginfo_t-struktur (dvs. at det er tekstsøger forskellig fra nul). På Linux, hvis infop er nul, så lykkes waitid() og returnerer proces-id'et for den ventet på-underproces. Programmer bør undgå at afhænge af denne inkonsistens, uden for standarden og unødvendige funktion.
Det følgende program demonstrerer brugen af fork(2) og waitpid(). Programmet opretter en underproces. Hvis intet kommandolinjeargument leveres til programmet, så suspenderer underprocessen dens afvikling via pause(2), for at tillade at brugeren kan sende signaler til underprocessen. Ellers, hvis et kommandolinjeargument anvendes, så afsluttes underprocessen øjeblikkeligt, via heltalet angivet på kommandolinjen som afslutningsstatus. Overprocessen afvikler en løkke, der overvåger underprocessen via waitpid(), og bruger W*()-makroer beskrevet ovenfor til at analysere wait-statusværdien.
Den følgende skalsession demonstrerer brugen af programmet:
$ ./a.out & Child PID is 32360 [1] 32359 $ kill -STOP 32360 stopped by signal 19 $ kill -CONT 32360 continued $ kill -TERM 32360 killed by signal 15 [1]+ Done ./a.out $
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
int wstatus;
pid_t cpid, w;
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Kode afviklet af underproces */
printf("Child PID is %jd\n", (intmax_t) getpid());
if (argc == 1)
pause(); /* Vent på signaler */
_exit(atoi(argv[1]));
} else { /* Kode afviklet af overproces */
do {
w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
} else if (WIFSTOPPED(wstatus)) {
printf("stopped by signal %d\n", WSTOPSIG(wstatus));
} else if (WIFCONTINUED(wstatus)) {
printf("continued\n");
}
} while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
exit(EXIT_SUCCESS);
}
}
_exit(2), clone(2), fork(2), kill(2), ptrace(2), sigaction(2), signal(2), wait4(2), pthread_create(3), core(5), credentials(7), signal(7)
Oversættere af denne manual til dansk Joe Hansen <joedalton2@yahoo.dk>
Denne oversættelse er gratis dokumentation; læs GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR.
Hvis du støder på fejl i oversættelsen af denne vejledning, skal du sende en besked til debian-l10n-danish@lists.debian.org.