.\" -*- coding: UTF-8 -*- .\" Copyright 1999, Andries E. Brouwer .\" Copyright 2006-2017, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH vfork 2 "8. februar 2026" "Linux man\-pages 6.17" .SH NAVN vfork \- opret en underproces og bloker overproces .SH BIBLIOTEK C\-standardbibliotek (\fIlibc\fP,\ \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .P \fBpid_t vfork(void);\fP .fi .P .RS -4 Feature Test Macro Requirements for glibc (se \fBfeature_test_macros\fP(7)): .RE .P \fBvfork\fP(): .nf .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED Siden glibc 2.12: (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L) || /* Siden 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE Før glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500 .fi .SH BESKRIVELSE .SS Standardbeskrivelse (Fra POSIX.1) har funktionen \fBvfork\fP() den samme effekt som \fBfork\fP(2), med den undtagelse at opførelsen ikke er defineret hvis processen oprettet af \fBvfork\fP() enten ændrer data udover en variabel af typen \fIpid_t\fP brugt til at lagre returværdien fra \fBvfork\fP(), eller returnerer fra funktionen hvori \fBvfork\fP() blev kaldt eller kalder en anden funktion før \fB_exit\fP(2) kaldes med succes eller en af \fBexec\fP(3)\-funktionsfamilien. .SS Linuxbeskrivelse \fBvfork\fP(), ligesom \fBfork\fP(2), opretter en underproces af den kaldende proces. For detaljer og returværdi og fejl, se \fBfork\fP(2). .P \fBvfork\fP() er et specielt tilfælde af \fBclone\fP(2). Bruges til at oprette nye processer uden at kopiere sidetabellen for overprocessen. Kan være nyttig i ydelsessensitive programmer, hvor en underproces er opretet, der øjeblikkeligt udsteder en \fBexecve\fP(2). .P \fBvfork\fP() er forskellig fra \fBfork\fP(2) ved at den kaldende tråd suspenderes indtil underprocessen afsluttes (enten normalt, ved at kalde \fB_exit\fP(2), eller unormalt, efter levering af et fatalt signal), eller den laver et kald til \fBexecve\fP(2). Indtil det punkt deler underprocessen al hukommelse med sin overproces, inklusive stakken. Underprocessen må ikke returnere fra den nuværende funktion eller kalde \fBexit\fP(3) (hvilket ville have den effekt at kalde afslutningshåndteringer etableret af overprocessen og tømme overprocessens \fBstdio\fP(3)\-mellemlagre, men må kalde \fB_exit\fP(2). .P Som med \fBfork\fP(2), så arver underprocessen oprettet af \fBvfork\fP() kopier af forskellige af kalderens procesattributter (f.eks. fildeskriptorer, signaldispositioner og nuværende arbejdsmappe); Kaldet \fBvfork\fP() er kun anderledes i behandlingen af det virtuelle adresserum, som beskrevet ovenfor. .P Signaler sendt til overprocessen ankommer efter at underprocessen frigiver overprocessens hukommelse (dvs. efter at underprocessen afslutter eller kalder \fBexecve\fP(2)). .SS "Historisk beskrivelse" Under Linux er \fBfork\fP(2) implementeret via copy\-on\-write\-sider, så den eneste straf for \fBfork\fP(2) er tid og hukommelse krævet for at dublikere overprocessens sidetabeller, og oprette en unik opgavestruktur for underprocessen. I de dårlige gamle dage ville \fBfork\fP(2) ofte kræve en fuld kopi af kalderens datarum, ofte unødvendigt, da der normalt umiddelbart efter udføres en \fBexec\fP(3). For større effektivitet introducerede BSD systemkaldet \fBvfork\fP(), der ikke kopierer adresserummet for overprocessen fuldt ud, men låner overprocessens hukommelse og kontroltråd indtil et kald til \fBexecve\fP(2) eller en afslut opstod. Overprocessen blev suspenderet mens underprocessen brugte sine ressourcer. Brug af \fBvfork\fP() var vanskelig: for eksempel gjorde det, at man ikke ændrede data i overprocessen, at man skulle kende til hvilke variabler, der var i et register. .SH VERSIONER .\" In AIXv3.1 vfork is equivalent to fork. Kravene placeret på \fBvfork\fP() af standarderne er svagere end dem placeret på \fBfork\fP(2), så en implementering hvor de to er synonyme er kompatibel. Især kan programmøren ikke afhænge af at overprocessen forbliver blokeret indtil underprocessen enten afsluttes eller kalder \fBexecve\fP(2), og kan ikke afhænge af en specifik opførelse med respekt for delt hukommelse. .P Nogle anser semantikken for \fBvfork\fP() at være en arkitekturmæssig skamplet, og 4.2BSD\-manualsiden sagde: \[lq]Dette systemkald vil blive elimineret når korrekte systemdelingsmekanismer er blevet implementeret. Brugere skal ikke afhænge af hukommelsesdelingssemantikken for \fIvfork\fP da den vil, i det tilfælde være synonym med \fIfork\fP.\[rq] Imidlertid, selv om moderne udstyr til hukommelseshåndtering er formindsket ydelsesforskellene mellem \fBfork\fP(2) og \fBvfork\fP(), er der forskellige årsager til hvorfor Linux og andre systemer har bevaret \fBvfork\fP(): .IP \[bu] 3 Nogle ydelseskritiske programmer kræver den lille ydelsesfordel tildelt af \fBvfork\fP(). .IP \[bu] .\" http://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork-and-vfork .\" http://developers.sun.com/solaris/articles/subprocess/subprocess.html .\" http://mailman.uclinux.org/pipermail/uclinux-dev/2009-April/000684.html .\" \fBvfork\fP() kan implementeres på systemer, der mangler en hukommelseshåndteringsenhed (MMU), men \fBfork\fP(2) kan ikke blive implementeret på sådanne systemer. (POSIX.1\-2008 fjernede \fBvfork\fP() fra standarden; POSIX\-rationalet for funktionen \fBposix_spawn\fP(3) bemærker, at den funktion, der tilbyder funktionalitet svarende til \fBfork\fP(2)+ \fBexec\fP(3), er designet til at kunne implementeres på systemer, der mangler en MMU). .IP \[bu] På systemer hvor hukommelse er begrænset undgår \fBvfork\fP() behovet for midlertidigt at tildele hukommelse (se beskrivelsen af \fI/proc/sys/vm/overcommit_memory\fP i \fBproc\fP(5)) for at kunne afvikle et nyt program. (Dette kan være specielt gavnligt hvor en stor overproces ønsker at afvikle et lille hjælpeprogram i en underproces). Som kontrast, brug af \fBfork\fP(2) i dette scenarie kræver enten indsendelse af en stor mængde hukommelse svarende til størrelsen af overprocessen (hvis streng overforpligtelse er tvunget) eller overbelastning af hukommelse med risiko for at en proces bliver afsluttet af out\-of\-memory\-dræberen (OOM). .SS Linux\-noter Forgreningshåndteirnger etableret under \fBpthread_atfork\fP(3) kaldes ikke, når et flertrådet program anvender NPTL\-trådbibliotekskaldet \fBvfork\fP(). Forgreningshåndteringer kaldes i dette tilfælde i et program via LinuxThreads\-trådbiblioteket. (Se \fBpthreads\fP(7) for en beskrivelse af Linux\-trådbiblioteker). .P Et kald til \fBvfork\fP() svarer til at kalde \fBclone\fP(2) med \fIflag\fP specificeret som: .P .in +4n .EX CLONE_VM | CLONE_VFORK | SIGCHLD .EE .in .SH STANDARDER Ingen. .SH HISTORIK 4.3BSD; POSIX.1\-2001 (men markeret FORÆLDET). POSIX.1\-2008 fjerner specifikationen af \fBvfork\fP(). .P .\" In the release notes for 4.2BSD Sam Leffler wrote: `vfork: Is still .\" present, but definitely on its way out'. .\" Systemkaldet \fBvfork\fP() dukkede op i 3.0BSD. I 4.4BSD blev det gjort synonymt med \fBfork\fP(2), men NetBSD introducerede det igen; se .UR http:\://www.netbsd.org\:/Documentation\:/kernel\:/vfork.html .UE . I Linux har det svaret til \fBfork\fP(2) indtil Linux 2.2.0\-pre6 eller deromkring. Siden Linux 2.2.0\-pre9 (på i386, lidt senere på andre arkitekturer) er det et uafhængigt systemkald. Understøttelse blev tilføjet i glibc 2.0.112. .SH FORBEHOLD Underprocessen bør være omhyggelig med ikke at ændre hukommelsen på uønskede måder, da sådanne ændringer vil blive sendt til overprocessen, når underprocessen afsluttes eller afvikler et andet program. I disse tilfælde kan signalhåndteringer være specielt problematiske: hvis en signalhåndtering der igangsættes i underprocessen for \fBvfork\fP() ændrer hukommelsen, kan disse ændringer medføre en inkonsistent procestilstand fra overprocessens perspektiv (f.eks. hukommelsesændringer vil være synlige i overprocessen, men ændringer til tilstanden for åbne fildeskriptorer vil ikke være synlige. .P .\" Når \fBvfork\fP() kaldes i en flertrådet proces, så suspenderes kun den kaldende tråd indtil underprocessen afsluttes eller afvikler et nyt program. Dette betyder at underprocessen deler et adresesrum med anden afviklende kode. Dette kan være farligt hvis en anden tråd i overprocessen ændrer akkreditiver (via \fBsetuid\fP(2) eller lignende), da der nu er to processer med forskellige privilegieniveauer kørende i det samme adresserum. Som et eksempel på farerne, antag at et flertrådet program, der afvikles som administrator opretter en underproces via \fBvfork\fP(). Efter \fBvfork\fP(), smider en tråd i overprocessen processen til en uprivilegeret bruger for at afvikle noget utroværdigt kode (f.eks. måske via udvidelsesmodul åbnet med \fBdlopen\fP(3)). I dette tilfælde er angreb muligt hvor overprocessen bruger \fBmmap\fP(2) til at indsætte kode, der vil blive afviklet af den privilegerede underproces. .SH FEJL .\" .\" As far as I can tell, the following is not true in Linux 2.6.19: .\" Currently (Linux 2.3.25), .\" .BR strace (1) .\" cannot follow .\" .BR vfork () .\" and requires a kernel patch. Detaljer for signalhåndteringen er obskure og forskellig mellem systemer. BSD\-manualsiden siger: »For at undgå et muligt dødvande, så sendes processer, der er underprocesser i midten af en \fBvfork\fP() aldrig til \fBSIGTTOU\fP\- eller \fBSIGTTIN\fP\-signaler; resultat eller \fIioctl\fP'er er derimod tilladt og inddataforsøg medfører en end\-of\-line\-indikation«. .SH "SE OGSÅ" \fBclone\fP(2), \fBexecve\fP(2), \fB_exit\fP(2), \fBfork\fP(2), \fB_Fork\fP(3), \fBunshare\fP(2), \fBwait\fP(2) .PP .SH OVERSÆTTELSE Oversættere af denne manual til dansk Joe Hansen . .PP Denne oversættelse er gratis dokumentation; læs .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR. .PP Hvis du støder på fejl i oversættelsen af ​​denne vejledning, skal du sende en besked til .MT debian-l10n-danish@lists.debian.org .ME .