vfork(2) System Calls Manual vfork(2) NAVN vfork - opret en underproces og bloker overproces BIBLIOTEK C-standardbibliotek (libc, -lc) SYNOPSIS #include pid_t vfork(void); Feature Test Macro Requirements for glibc (se feature_test_macros(7)): vfork(): Siden glibc 2.12: (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L) || /* Siden 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE For glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500 BESKRIVELSE Standardbeskrivelse (Fra POSIX.1) har funktionen vfork() den samme effekt som fork(2), med den undtagelse at opforelsen ikke er defineret hvis processen oprettet af vfork() enten aendrer data udover en variabel af typen pid_t brugt til at lagre returvaerdien fra vfork(), eller returnerer fra funktionen hvori vfork() blev kaldt eller kalder en anden funktion for _exit(2) kaldes med succes eller en af exec(3)-funktionsfamilien. Linuxbeskrivelse vfork(), ligesom fork(2), opretter en underproces af den kaldende proces. For detaljer og returvaerdi og fejl, se fork(2). vfork() er et specielt tilfaelde af clone(2). Bruges til at oprette nye processer uden at kopiere sidetabellen for overprocessen. Kan vaere nyttig i ydelsessensitive programmer, hvor en underproces er opretet, der ojeblikkeligt udsteder en execve(2). vfork() er forskellig fra fork(2) ved at den kaldende trad suspenderes indtil underprocessen afsluttes (enten normalt, ved at kalde _exit(2), eller unormalt, efter levering af et fatalt signal), eller den laver et kald til execve(2). Indtil det punkt deler underprocessen al hukommelse med sin overproces, inklusive stakken. Underprocessen ma ikke returnere fra den nuvaerende funktion eller kalde exit(3) (hvilket ville have den effekt at kalde afslutningshandteringer etableret af overprocessen og tomme overprocessens stdio(3)-mellemlagre, men ma kalde _exit(2). Som med fork(2), sa arver underprocessen oprettet af vfork() kopier af forskellige af kalderens procesattributter (f.eks. fildeskriptorer, signaldispositioner og nuvaerende arbejdsmappe); Kaldet vfork() er kun anderledes i behandlingen af det virtuelle adresserum, som beskrevet ovenfor. Signaler sendt til overprocessen ankommer efter at underprocessen frigiver overprocessens hukommelse (dvs. efter at underprocessen afslutter eller kalder execve(2)). Historisk beskrivelse Under Linux er fork(2) implementeret via copy-on-write-sider, sa den eneste straf for fork(2) er tid og hukommelse kraevet for at dublikere overprocessens sidetabeller, og oprette en unik opgavestruktur for underprocessen. I de darlige gamle dage ville fork(2) ofte kraeve en fuld kopi af kalderens datarum, ofte unodvendigt, da der normalt umiddelbart efter udfores en exec(3). For storre effektivitet introducerede BSD systemkaldet vfork(), der ikke kopierer adresserummet for overprocessen fuldt ud, men laner overprocessens hukommelse og kontroltrad indtil et kald til execve(2) eller en afslut opstod. Overprocessen blev suspenderet mens underprocessen brugte sine ressourcer. Brug af vfork() var vanskelig: for eksempel gjorde det, at man ikke aendrede data i overprocessen, at man skulle kende til hvilke variabler, der var i et register. VERSIONER Kravene placeret pa vfork() af standarderne er svagere end dem placeret pa fork(2), sa en implementering hvor de to er synonyme er kompatibel. Isaer kan programmoren ikke afhaenge af at overprocessen forbliver blokeret indtil underprocessen enten afsluttes eller kalder execve(2), og kan ikke afhaenge af en specifik opforelse med respekt for delt hukommelse. Nogle anser semantikken for vfork() at vaere en arkitekturmaessig skamplet, og 4.2BSD-manualsiden sagde: "Dette systemkald vil blive elimineret nar korrekte systemdelingsmekanismer er blevet implementeret. Brugere skal ikke afhaenge af hukommelsesdelingssemantikken for vfork da den vil, i det tilfaelde vaere synonym med fork." Imidlertid, selv om moderne udstyr til hukommelseshandtering er formindsket ydelsesforskellene mellem fork(2) og vfork(), er der forskellige arsager til hvorfor Linux og andre systemer har bevaret vfork(): o Nogle ydelseskritiske programmer kraever den lille ydelsesfordel tildelt af vfork(). o vfork() kan implementeres pa systemer, der mangler en hukommelseshandteringsenhed (MMU), men fork(2) kan ikke blive implementeret pa sadanne systemer. (POSIX.1-2008 fjernede vfork() fra standarden; POSIX-rationalet for funktionen posix_spawn(3) bemaerker, at den funktion, der tilbyder funktionalitet svarende til fork(2)+ exec(3), er designet til at kunne implementeres pa systemer, der mangler en MMU). o Pa systemer hvor hukommelse er begraenset undgar vfork() behovet for midlertidigt at tildele hukommelse (se beskrivelsen af /proc/sys/vm/overcommit_memory i proc(5)) for at kunne afvikle et nyt program. (Dette kan vaere specielt gavnligt hvor en stor overproces onsker at afvikle et lille hjaelpeprogram i en underproces). Som kontrast, brug af fork(2) i dette scenarie kraever enten indsendelse af en stor maengde hukommelse svarende til storrelsen af overprocessen (hvis streng overforpligtelse er tvunget) eller overbelastning af hukommelse med risiko for at en proces bliver afsluttet af out-of-memory-draeberen (OOM). Linux-noter Forgreningshandteirnger etableret under pthread_atfork(3) kaldes ikke, nar et flertradet program anvender NPTL-tradbibliotekskaldet vfork(). Forgreningshandteringer kaldes i dette tilfaelde i et program via LinuxThreads-tradbiblioteket. (Se pthreads(7) for en beskrivelse af Linux-tradbiblioteker). Et kald til vfork() svarer til at kalde clone(2) med flag specificeret som: CLONE_VM | CLONE_VFORK | SIGCHLD STANDARDER Ingen. HISTORIK 4.3BSD; POSIX.1-2001 (men markeret FORAELDET). POSIX.1-2008 fjerner specifikationen af vfork(). Systemkaldet vfork() dukkede op i 3.0BSD. I 4.4BSD blev det gjort synonymt med fork(2), men NetBSD introducerede det igen; se . I Linux har det svaret til fork(2) indtil Linux 2.2.0-pre6 eller deromkring. Siden Linux 2.2.0-pre9 (pa i386, lidt senere pa andre arkitekturer) er det et uafhaengigt systemkald. Understottelse blev tilfojet i glibc 2.0.112. FORBEHOLD Underprocessen bor vaere omhyggelig med ikke at aendre hukommelsen pa uonskede mader, da sadanne aendringer vil blive sendt til overprocessen, nar underprocessen afsluttes eller afvikler et andet program. I disse tilfaelde kan signalhandteringer vaere specielt problematiske: hvis en signalhandtering der igangsaettes i underprocessen for vfork() aendrer hukommelsen, kan disse aendringer medfore en inkonsistent procestilstand fra overprocessens perspektiv (f.eks. hukommelsesaendringer vil vaere synlige i overprocessen, men aendringer til tilstanden for abne fildeskriptorer vil ikke vaere synlige. Nar vfork() kaldes i en flertradet proces, sa suspenderes kun den kaldende trad indtil underprocessen afsluttes eller afvikler et nyt program. Dette betyder at underprocessen deler et adresesrum med anden afviklende kode. Dette kan vaere farligt hvis en anden trad i overprocessen aendrer akkreditiver (via setuid(2) eller lignende), da der nu er to processer med forskellige privilegieniveauer korende i det samme adresserum. Som et eksempel pa farerne, antag at et flertradet program, der afvikles som administrator opretter en underproces via vfork(). Efter vfork(), smider en trad i overprocessen processen til en uprivilegeret bruger for at afvikle noget utrovaerdigt kode (f.eks. maske via udvidelsesmodul abnet med dlopen(3)). I dette tilfaelde er angreb muligt hvor overprocessen bruger mmap(2) til at indsaette kode, der vil blive afviklet af den privilegerede underproces. FEJL Detaljer for signalhandteringen er obskure og forskellig mellem systemer. BSD-manualsiden siger: >>For at undga et muligt dodvande, sa sendes processer, der er underprocesser i midten af en vfork() aldrig til SIGTTOU- eller SIGTTIN-signaler; resultat eller ioctl'er er derimod tilladt og inddataforsog medforer en end-of-line-indikation<<. SE OGSA clone(2), execve(2), _exit(2), fork(2), _Fork(3), unshare(2), wait(2) 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 vfork(2)