Avatar billede web_the_world Nybegynder
10. februar 2004 - 15:02 Der er 7 kommentarer

lidt hjælp til semafor

vi har siddet og kodet et program, hvor vi skal bruge semafor... det virker ikke helt efter hensigten, derfor ville vi gerne have forklaret hvad det egentlig helt præcist er der sker i nedenstående kode....

  //opret semafor sæt
  sem_id = semget((key_t)1234, 250, 0666 | IPC_CREAT);
 
  //check semafor sæt er ok
  if(sem_id == -1)
  {
    printf("Kunne ikke oprette semafor saet \n");
    exit(0);
  }
 
  //opret semaforer
  for(semnr = 1; semnr < 250; semnr++)
  {
    //if(semnr == 242 || semnr == 243)
    //  sem_union.val = 5;
    //else
      sem_union.val = 1;
   
    //sæt semafor værdi
    if(semctl(sem_id, semnr, SETVAL, sem_union) == -1)
    {
    printf("Fejl ved semafor nr %d \n", semnr);
      exit(0);
    }
Avatar billede web_the_world Nybegynder
10. februar 2004 - 16:41 #1
er der virkelig ingen der kan hjælpe....
Avatar billede web_the_world Nybegynder
10. februar 2004 - 19:01 #2
HJÆLP
Avatar billede bertelbrander Novice
10. februar 2004 - 20:27 #3
Jeg har ingen ide om hvad der sker, eller skulle ske.

Hvilket system kører det på? Det ligner ikke en udgave af semafor jeg har set før.

Det hjælper ikke at "polle", folk svarer nok når de kommer forbi. Der er folk der laver andet end vente på at "få lov" til at svare på spørgsmål på eksperten. F.ex. er jeg sjældent "på" før ca. 20.00.
Avatar billede web_the_world Nybegynder
10. februar 2004 - 21:11 #4
ja, det ved jeg godt... var bare lige lidt presset... :-)
Avatar billede dimsey Nybegynder
11. februar 2004 - 09:59 #5
Jeg sidder selv med samme problemstilling og vil gerne prøve at hjælpe...
Avatar billede dimsey Nybegynder
11. februar 2004 - 10:17 #6
sem_id = semget((key_t)1234, 250, 0666 | IPC_CREAT);
opretter id for hver semafor med en adr. nøgle, næste kan jeg ikke huske, og skriverettigheder. Det er ikke sikkert at det er nødvendigt at erklære IPC_CREAT (det står i Linuxbogen) da det er sjældent at denne bruges.

if(sem_id == -1)
  {
    printf("Kunne ikke oprette semafor saet \n");
    exit(0);
  }
Chekker om der opstår en fejl ved oprettelsen af semafor id - hvis ja afsluttes programmet.

for(semnr = 1; semnr < 250; semnr++)
  {
    //if(semnr == 242 || semnr == 243)
    //  sem_union.val = 5;
    //else
      sem_union.val = 1;
mener jeg tager den union værdi (se længere oppe i eksemplet med "Dining Philosophers" hvor "union semum" erklæres) og opretter semaforer ud fra de kriterier der er givet der.

if(semctl(sem_id, semnr, SETVAL, sem_union) == -1)
    {
    printf("Fejl ved semafor nr %d \n", semnr);
      exit(0);
    }
kan jeg ikke lige forklare på stående fod men vender gerne tilbage om et par timer med et svar;) men umiddelbart tager den de værdier der erklæres i semctl og chekker for fejl.
Avatar billede dimsey Nybegynder
11. februar 2004 - 12:15 #7
if(semctl(sem_id, semnr, SETVAL, sem_union) == -1)
    {
    printf("Fejl ved semafor nr %d \n", semnr);
      exit(0);
    }
semctl() giver direkte kontrol med semaforerne ud fra de værdier der er angivet. sem_id og semnr giver sig selv, SETVAL initialiserer semaforen til at modtage en værdi og sem_union er der værdien komme fra. Hvis der opstår en fejl udskrives der en fejl på skærmen.
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