Avatar billede mxs Nybegynder
22. maj 2006 - 10:33 Der er 9 kommentarer og
1 løsning

brug af fork

Hej

Jeg har i lang tid læst lidt om sockets, og jeg vil nu gerne lidt videre i mine studier, og da jeg har læst mange kodeeksempler som brugte fork funktionen, og aner at det læner sig op af fleretrådet programmering, så har jeg valgt at gå videre med lige netop multitrådet programmering. Man skal jo som sagt starte et sted, så jeg vil gerne vide lidt om denne fork funktion, som spawner en kopi af hovedprocessen til en childprocess og køre disse to sideløbende. Er det rigtigt? Det jeg så gerne vil vide er hvordan det bruges. Jeg har søgt lidt på nettet og fundet noget på den gode engelske wikipedia.org, http://en.wikipedia.org/wiki/Fork_%28operating_system%29 - og som jeg kan se via overskriften, så bliver denne funktion styret af operativsystemet? Det jeg gerne vil vide er: Når jeg kalder funktionen, fork i en fil, er det så alt hvad der tilhører denne fil som bliver kopieret? Er der andre måder at lave dette på? Som fx. mutex?

På forhånd tak,
Martin Slot
Avatar billede mxs Nybegynder
22. maj 2006 - 10:37 #1
Jeg har selv lige lavet en lille kode, som ser ud til at virke. Ud fra denne kode kan jeg vel konkludere at det er hele filen der bliver kopieret, hvilket jo også er meget logisk da hele denne exec får den egen tråd, som jo så bliver kopieret til en ny tråd.

#include <iostream>
using namespace std;

int main()
{

  int pid = fork();

  if(pid == 0)
    {
      cout << "hej superprocess"<<endl;

    }else if(pid > 0)
      {
    cout << "hej childprocess"<<endl;
      }

}
Avatar billede tiller3 Nybegynder
22. maj 2006 - 16:45 #2
Du skal vaere opmaerksom paa at fork laver en ny process, som er en klon af den eksisterende process, ikke en ny traad i den eksisterende process.

(Og for dokumentation af fork, skriv)
man fork
eller
info fork

(Hvis du vil bruge traade, skal du have fat i posix_threads eller lignende.

(Og fork er et posix kald, saa jeg gaar ud fra at du ikke bruger windows)
Avatar billede mxs Nybegynder
22. maj 2006 - 16:51 #3
tiller3, jeg har minsandten prøvet man fork og info fork, men min man pages kan ikke finde noget om den, men efter jeg har læst lidt mere om det kan jeg godt se at fork og tråde er noget vidt forskelligt. Altså hvis jeg opretter nogle nye tråde, så bliver det lavet i samme process? Men hvis jeg bruger fork, så bliver der oprettet en hel ny process?
Avatar billede bertelbrander Novice
26. maj 2006 - 00:04 #4
Fork laver en ny process der er en kopi af den oprindelige.
Tråde kører i samme process.

fork er (imho) en forældet linux/unix ting, som man bør undgå hvis man kan.
Avatar billede tiller3 Nybegynder
26. maj 2006 - 00:07 #5
Fork er den eneste maade at klone en process i posix, og den er derfor ikke foraeldet hvis det er det man vil.

Men den kan ikke bruges til traade.
Avatar billede bertelbrander Novice
26. maj 2006 - 00:12 #6
Måske fordi jeg ikke har lavet ret meget unix/linux; hvorfor skulle man ønske at klone en process hvis man kan lave tråde?
Avatar billede tiller3 Nybegynder
26. maj 2006 - 01:10 #7
Det er normalt en teknik der bruges i forbindelse med servere.

Apache for eksempel, kalder fork hvergang den modtager et request. Saa kalder den fork, og lader childet svare paa requested. Det har to fordele. For det foerste betyder der, at hvis child processen crasher(Sker af og til, hvis man bruger ustabile moduler, saa som visse versioner af php), saa koere den oprindelige apache process videre, og den kan fortsat svare paa requests.

For det andet er der en sikkerheds fordel. Apache er noed til at koere som root(admin)  men naar den saa modtager en requst, saa forker den, og saa saetter den rettighederne for det nye child til nobody, saaledes at det child som svare paa requested ikke har rettigheder det ikke skal bruge. Det betyder at hvis en fejl goer at man kan hacke apache, saa faar man kun rettigheder som nobody i stedet for root.

Nu kan det jo lyde dyrt at lave et en ny process, som jo er en komplet kopi af den eksisterende hvergang man skal svare paa et request, men fordi linux/unix har cow(Copy on write), er det kun data der bliver aendret der faktisk kopieres.

Traade kan vaere temligt besvaerlige fordi de ved fejl kan aendre i hinandens data hvilket goer dem temligt besvaerlige at debugge. Men af og til kan man ikke klare sig uden.
Avatar billede bertelbrander Novice
26. maj 2006 - 01:14 #8
Tja, windows klarer sig fint uden fork. Men tak for forklaring.
Avatar billede tiller3 Nybegynder
26. maj 2006 - 01:23 #9
Det er bare fordi windows ikke implementere posix. Men windows har muligheden for at lave processer ligesom fork goer. De har dog ikke cow, saa den copiere alt koden hver gang, hvilket goer at den ikke kan bruges som beskrevet.
Avatar billede bertelbrander Novice
26. maj 2006 - 01:27 #10
Normalt vil større programmer på windows bruge DLL'er til hovedparten af koden, og DLL'er bliver vel ikke kopieret for hver process?

Jeg er ikke sikker på at det er en ulempe at windows ikke har posix, standard posix tråde har f.ex. ikke prioritet, hvilket i mine øjne er en fatal fejl.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester