Avatar billede trp79 Nybegynder
14. september 2002 - 13:36 Der er 9 kommentarer og
1 løsning

sleep() og fork()

Hello
vi sidder og kæmper med lidt c, men vi kan ikke finde ud at bruge sleep() og fork(), og hvad de helt nøjagtigt gør.
vores opgave lyder på at lave 11 barneprocesser. Hver gang en barneproces er skabt skal den vente i 2 sek., hvorefter den skal tælle til 10
Avatar billede mbulow Nybegynder
14. september 2002 - 16:48 #1
sleep(x): Får en process til at sove (pause) i x antal sekunder

fork(): Laver en klon af processen, og fortsætter begge processer (originalen og klonen) fra det punkt hvor fork blev kaldt.
Ved at undersøge fork's retur-værdi kan man finde ud af om det er originalen eller klonen:
- I original-processen returnerer fork, process-ID'et for klonen.
- I klon-processen returnerer fork værdien 0

Lille eksempel:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
  pid_t procID;

  printf("Venter 2 sekunder før vi fortsætter ;)\n");
  sleep(2);

  printf("Kloner processen, og begge fortæller hvem de er:\n");
  procID = fork();

  if(procID != 0)
      printf("Jeg er original-processen!\n");
  else
      printf("Jeg er klon-processen!\n");

  return 0; 
}



Jeg har løst selve opgaven, så hvis der er problemer skal vi nok finde ud af det ;) Vil bare ikke give en løsning hvis du/i selv vil finde ud af det.
Kan dog røbe så meget at JEG har løst den med:
  2 for-løkker
  1 if-sætning
  1 break
Avatar billede mbulow Nybegynder
14. september 2002 - 17:06 #2
Hmm... Egentlig ikke helt sikker på om sleep pauser hele processen, eller om det kun er den aktuelle thread i processen.
Men i det her tilfælde er det ligegyldigt for der arbejdes på processer, der kun har en thread hver.
Avatar billede mbulow Nybegynder
14. september 2002 - 17:10 #3
OK... Læst lidt op på det... (En hurtig google søgning)
sleep ser ud til at pause thread'en, og ikke hele processen

Jaja... Er vist efterhånden længe siden jeg har arbejdet med multithreading :) hehe
Avatar billede trp79 Nybegynder
14. september 2002 - 17:29 #4
jeg har løst den, men du må gerne give mig løsningen til sammenligning
Avatar billede trp79 Nybegynder
14. september 2002 - 17:32 #5
Kan jeg originalens procesID?
Avatar billede mbulow Nybegynder
14. september 2002 - 17:36 #6
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
  int i, j;
  pid_t procID;

  for(i = 0; i < 11; i++){
      procID = fork();            //Klon processen
      if(procID == 0){            //Er den her process en klon?
        sleep(2);                //Vent i 2 sekunder
        for(j = 1; j <= 10; j++)  //Tael til 10
            printf("%d\n", j);
        break;                    //Kloner skal afbryde for-løkken
      }
  }

  return 0;
}
Avatar billede mbulow Nybegynder
14. september 2002 - 17:37 #7
En process kan aflæse sin egen process-ID ved at kalde den her funktion:
  pid_t getpid();
Avatar billede trp79 Nybegynder
14. september 2002 - 18:23 #8
Hvad betyder denne linie: pid_t procID; ? Er det at man erklare pid_t som "et procesnr.". Altså ligesom man erklære en int fx?
Avatar billede mbulow Nybegynder
14. september 2002 - 18:31 #9
Opretter en variabel af typen pid_t med navnet procID
Så yep yep :)
Avatar billede trp79 Nybegynder
14. september 2002 - 19:58 #10
Vi takker! Det var pænt af dig at svarer udover det første spørgsmål...
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