wait(2) System Calls Manual wait(2) NAVN wait, waitpid, waitid - vent pa at processen aendrer tilstand BIBLIOTEK C-standardbibliotek (libc, -lc) SYNOPSIS #include 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-graensefladen; se VERSIONS for information om det ra systemkald. */ Feature Test Macro Requirements for glibc (se feature_test_macros(7)): 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 BESKRIVELSE Alle disse systemkald bruges til at vente pa tilstandsaendringer i en underproces af den kaldende proces, og hente information om underprocessen, hvis tilstand har aendret sig. En tilstandsaendring anses for at vaere: underprocessen afsluttedes; underprocessen blev stoppet af et signal; eller underprocessen blev genoptaget af et signal. I tilfaeldet med en afsluttet underproces vil udforelse af en wait gore det muligt for systemet at frigive ressourcerne associeret med underprocessen; hvis en wait ikke udfores, sa bliver den afsluttede underproces i en >>zombie<<-tilstand (se NOTES nedenfor). Hvis en underproces allerede har aendret tilstand, sa returneres disse kald ojeblikkeligt. ellers blokerer de indtil en underproces aendrer tilstand eller en signalhandtering afbryder kaldet (under antagelse af at systemkaldene ikke automatisk genstartes via flaget SA_RESTART for sigaction(2)). Pa resten af denne side vil en underproces, hvis tilstand har aendret sig og endnu ikke har modtaget en wait af et af disse systemkald blive kaldt for waitable. wait() og waitpid() Systemkaldet wait() suspenderer afviklingen af den kaldende trad indtil en af dens underprocesser afsluttes. Kaldet wait(&wstatus) svarer til: waitpid(-1, &wstatus, 0); Systemkaldet waitpid() suspenderer afviklingen af den kaldende trad indtil en underproces angivet af argumentet pid har aendret tilstand. Som standard venter waitpid() kun pa afsluttede underprocesser, men denne opforsel kan aendres via argumentet options, som beskrevet nedenfor. Vaerdien af pid kan vaere: < -1 vent pa nehver underproces hvis procesgruppe-id svarer til den absolutte vaerdi for pid. -1 vent pa enhver underproces. 0 vent pa enhver underproces hvis procesgruppe-id svarer til den kaldende proces pa tidspunktet for kaldet til waitpid(). > 0 vent pa underprocessen hvis proces-id svarer til vaerdien for pid. Vaerdien af tilvalg er en OR af nul eller flere af de folgende konstanter: WNOHANG returner ojeblikkeligt hvis ingen underproces er afsluttet. WUNTRACED returnerer ogsa hvis en underproces er stoppet (men ikke sporet via ptrace(2)). Status for traced-underprocesser, der er stoppet tilbydes selv om denne mulighed ikke er angivet. WCONTINUED (siden Linux 2.6.10) returnerer ogsa hvis en stoppet underproces er blevet genoptaget ved levering af SIGCONT. (For tilvalg kun for Linux, se nedenfor). Hvis wstatus er NULL sa lagrer wait() og waitpid() statusinformation i den int der peges pa. Dette heltal kan inspiceres med de folgende makroer (der bruger selve heltallet som et argument, ikke en tekstsoger, som det gores i wait() og waitpid()!): WIFEXITED(wstatus) returnerer true (sand) hvis underprocesen blev afsluttet normalt, det vil sige, ved at kalde exit(3) eller _exit(2), eller ved at returnere fra main(). WEXITSTATUS(wstatus) returnerer afslutningsstatus for underprocessen. Denne bestar af de mindst signifikante 8 bit for argumentet status, som underprocessen angav i et kald til exit(3) eller _exit(2) eller som argumentet for et returudtryk i main(). Denne makro bor kun udrulles hvis WIFEXITED returnerede true (sand). WIFSIGNALED(wstatus) returnerer true (sand) hvis underprocessen blev afsluttet af et signal. WTERMSIG(wstatus) returnerer nummeret for signalet, der medforte at underprocessen blev afsluttet. Denne makro bor kun anvendes hvis WIFSIGNALED returnerede true (sand). WCOREDUMP(wstatus) // POSIX.1-2024 returnerer true (sand) hvis underprocessen fremstillede et kernedump (se core(5)). Denne makro skal kun bruges hvis WIFSIGNALED returnede true. WIFSTOPPED(wstatus) // POSIX.1-2024 returnerer true (sand) hvis underprocessen blev stoppet af en levering af et signal; dette er kun muligt hvis kaldet blev udfort via WUNTRACED eller nar underprocessen bliver sporet (se ptrace(2)). WSTOPSIG(wstatus) returnerer nummeret for signalet som fik underprocessen til at stoppe. Denne makro bor kun bruges hvis WIFSTOPPED returnerede true. WIFCONTINUED(wstatus) (siden Linux 2.6.10) returnerer true (sand) hvis underprocessen blev genoptaget ved levering af SIGCONT. waitid() Systemkaldet waitid() (tilgaengelig siden Linux 2.6.9) tilbyder mere praecis kontrol over hvilke tilstandaendringer for underprocesser, der skal ventes pa. Argumenterne idtype og id vaelger underprocesserne, der skal ventes pa, som folgende: idtype == P_PID Vent pa underprocessen hvis proces-id matcher id. idtype == P_PIDFD (siden Linux 5.4) Vent for underprocessen refereret til af PID-fildeskriptoren angivet i id. (Se pidfd_open(2) for yderligere information om PID-fildeskriptorer). idtype == P_PGID Vent pa en underproces hvis procesgruppe-id machter id. Siden Linux 5.4, hvis id er nul, sa vent pa eventuelle underprocesser, der er i den samme procesgruppe som kalderens procesgruppe pa tidspunktet for kaldet. idtype == P_ALL Vent pa en eventuel underproces; id bliver ignoreret. Underprocestilstanden aendres til vent pa er angivet af ORing en eller flere af de folgende flag i options: WEXITED Vent pa underprocesser der er afsluttet. WSTOPPED Vent pa underprocesser der er blevet stoppet af en signallevering. WCONTINUED Vent pa (tidligere stoppet) underproces, der er blevet genoptaget ved levering af SIGCONT. De folgende flag kan yderligere blive ORed i options: WNOHANG Som for waitpid(). WNOWAIT Efterlad underprocessen i en ventende tilstand; et senere vente-kald kan bruges til igen at hente underprocessens statusinformation. Ved succesfuld returnering udfylder waitid() de folgende felter i strukturen siginfo_t peget mod af infop: si_pid Proces-id for underprocessen. si_uid Det reelle bruger-id for underprocessen. (Dette felt er ikke angivet pa de fleste implementeriner). si_signo Angiv altdi som SIGCHLD. si_status Enten afslutningsstatus for underprocessen, som angivet til _exit(2) (eller exit(3)), eller signalet der medforte at underprocessen blev afsluttet, stoppet eller fortsatte. Feltet si_code kan bruges til at bestemme hvordan dette felt skal fortolkes. si_code Angiv til en af: CLD_EXITED (underproces kaldt _exit(2)); CLD_KILLED (underproces draebt af signal); CLD_DUMPED (underproces draebt af signal, og dumpet kerne); CLD_STOPPED (underproces stoppet af signal); CLD_TRAPPED (sporet underproces er fanget); eller CLD_CONTINUED (underproces forsat af SIGCONT). Hvis WNOHANG blev angivet i tilvalg og der ingen underprocesser var i en ventende tilstand, sa returnerer waitid() 0 ojeblikkeligt og tilstanden for strukturen siginfo_t pegende mod infop afhaenger af implementeringen. For (flytbart) at skelne dette tilfaelde fra hvor en underproces var i en ventende tilstand, nulstil feltet si_pid for kaldet og tjek for en vaerdi forskellig fra nul i dettte felt efter kaldet returnerer. POSIX.1-2008 Technical Corrigendum 1 (2013) tilfojer kravet at nar WNOHANG er angivet i tilvalg og der er ingen underproces i en ventende tilstand, sa bor waitid() nulstille felterne si_pid og si_signo for strukturen. Pa Linux og andre implementeringer, der overholder dette krav, er det ikke nodvendigt at nulstille feltet si_pid for waitid() kaldes. Alle implementeringer folger dog ikke POSIX.1-specifikationen pa dette tidspunkt. RETURVAERDI 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 aendret sig; hvis WNOHANG blev angivet og en eller flere underprocesser angivet af pid findes, men endnu ikke har aendret tilstand, sa 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 aendret tilstand; ved fejl returneres -1. Ved fejl, angiver hvert af disse kald errno for at indikere fejlen. FEJL EAGAIN PID-fildeskriptoren angivet i id er ikkeblokerende og processen den referer til er ikke afsluttet. ECHILD (for wait()) Den kaldende proces har ingen ej ventet for underproces. ECHILD (for waitpid() eller waitid()) Processen angivet af pid (waitpid()) eller idtype og id (waitid()) findes ikke eller er ikke en underproces af den kaldende proces. (Dette kan ske for ens egen underproces hvis handlingen for SIGCHLD er angivet til SIG_IGN. Se ogsa afsnittet Linux Notes om trade). EINTR WNOHANG var ikke angivet og et ej blokeret signal eller en SIGCHLD blev opfanget; se signal(7). EINVAL Argumentet tilvalg var ugyldigt. ESRCH (for wait() eller waitpid()) svarer pid til INT_MIN. VERSIONER C-bibliotek/kerne-forskelle wait() er faktisk en biblioteksfunktion der (i glibc) er implementeret som et kald til wait4(2). Pa nogle arkitekturer er det intet waitpid()-systemkald; i stedet for er denne graenseflade implementeret via en C-biblioteksomslagsfunktion, der kalder wait4(2). Det ra systemkald waitid() anvender et femte argument, af typen struct rusage *. Hvis dette argument er forskellig fra NULL, sa bruges det til at returnere information om ressourceforbrug for underprocessen, pa samme made som wait4(2). Se getrusage(2) for detaljer. STANDARDER POSIX.1-2024. HISTORIK SVr4, 4.3BSD, POSIX.1-2001. NOTER En underproces der afsluttes, men der ikke er blevet ventet pa bliver en >>zombie<<. Kernen vedligeholder et minimum af information om zombieprocessen (PID, afslutningsstatus, information om ressourceforbrug) for at overprocessen senere kan udfore en wait for at fa information om underprocessen. Sa laenge en zombie ikke fjernes fra systemet via en wait, sa vil den bruge en plads i kerneprocestabellen og hvis denne tabel bliver fyldt, sa vil der ikke laengere kunne oprettes yderligere processer. Hvis en overproces afsluttes, sa bliver dens (hvis nogen) >>zombieprocesser<< adopteret af init(1), (eller af den naermeste >>subreaper<<-proces som defineret via brugen af prctl(2) PR_SET_CHILD_SUBREAPER-operationen); init(1) udforer 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)), sa bliver underprocessen, der afsluttes, ikke en zombie og et kald til wait() eller waitpid() vil blokere indtil alle underprocesser er afsluttet, og sa fejle med errno angivet til ECHILD. (Den oprindelige POSIX-standard efterlod opforelsen med at angive SIGCHLD til SIG_IGN uspecificeret. Bemaerk at selvom standarddispositionen for SIGCHLD er >>ignore<< (ignorer), sa medforer eksplicit angivelse af dispositionen til SIG_IGN forskellig behandling af zombieunderprocesser). Linux 2.6 overholder POSIX-kravene. Linux 2.4 (og tidligere) gor dog ikke: hvis et wait()- eller waitpid()-kald laves mens SIGCHLD bliver ignoreret, sa opforer kaldet sig som at SIGCHLD ikke blev ignoreret, det vil sige, kaldet blokeres indtil den naeste underproces afsluttes og returnerer sa proces-id'et og status for den underproces. Linux-noter I Linuxkernen er en kerneplanlagt trad ikke en distinkt konstruktion fra en proces. I stedet er en trad bare en proces, der oprettes via det Linux-unikke systemkald clone(2); andre rutiner sasom det flytbare kald pthread_create(3) implementeres via clone(2). For Linux 2.4 var en trad bare en speciel proces og som konsekvens kunne en trad ikke vente pa underprocessen i en anden trad, selv om den sidstnaevnte tilhorer den samme tradgruppe. POSIX foreskriver dog sadan funktionalitet, og siden Linux 2.4 kan en trad, og vil som standard, vente pa underprocesser i andre trade i den samme tradgruppe. De folgende Linux-specifikke tilvalg er for brug med underproces oprettet via clone(2); de kan ogsa, siden Linux 4.7, bruges med waitid(): __WCLONE Vent kun pa >>klon<<-underproces. Hvis udeladt sa vent kun pa >>ikke-klon<<-underproces. (En >>klon<<-underproces er en der ikke leverer et signal, eller et signal udover SIGCHLD til sin overproces ved afslutning). Dette tilvalg ignoreres hvis __WALL ogsa er angivet. __WALL (siden Linux 2.4) Vent pa alle underprocesser, uanset typen (>>clone<< eller >>non-clone<<). __WNOTHREAD (siden Linux 2.4) Vent ikke pa underprocesser for andre trade i den samme tradgruppe. Dette var standarden for Linux 2.4. Siden Linux 4.7, antages flaget __WALL automatisk hvis underprocessen bliver ptraced. FEJL Jaevnfor POSIX.1-2008 skal et program der kalder waitid() sikre at infop peger pa en siginfo_t-struktur (dvs. at det er tekstsoger forskellig fra nul). Pa Linux, hvis infop er nul, sa lykkes waitid() og returnerer proces-id'et for den ventet pa-underproces. Programmer bor undga at afhaenge af denne inkonsistens, uden for standarden og unodvendige funktion. EKSEMPLER Det folgende program demonstrerer brugen af fork(2) og waitpid(). Programmet opretter en underproces. Hvis intet kommandolinjeargument leveres til programmet, sa suspenderer underprocessen dens afvikling via pause(2), for at tillade at brugeren kan sende signaler til underprocessen. Ellers, hvis et kommandolinjeargument anvendes, sa afsluttes underprocessen ojeblikkeligt, via heltalet angivet pa kommandolinjen som afslutningsstatus. Overprocessen afvikler en lokke, der overvager underprocessen via waitpid(), og bruger W*()-makroer beskrevet ovenfor til at analysere wait-statusvaerdien. Den folgende 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 $ Programkilde #include #include #include #include #include #include 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 pa 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); } } SE OGSA _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) OVERSAETTELSE Oversaettere af denne manual til dansk Joe Hansen Denne oversaettelse er gratis dokumentation; laes GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR. Hvis du stoder pa fejl i oversaettelsen af denne vejledning, skal du sende en besked til . Linux man-pages 6.17 8. februar 2026 wait(2)