» »

[Naloga][C] Tabela kazalcev na funkcije (simulacija sistemskih klicev)

[Naloga][C] Tabela kazalcev na funkcije (simulacija sistemskih klicev)

miha22 ::

Zivjo

na faksu smo dobili za sprogramirat programcek za katerega pa ne vem kako se ga lotit.
Ta program naj bi prikazal delovanje klica sistemskih klicev v OS,
torej imamo eno tabelico naslovov funkcij in potem imas nek handler, ki
ga poklices samo s stevilko (naslovom) v tej tabelici in on mora
poklicati tisto funkcijo s pravega mesta v tabelici stevilka je podana kot argument programu.
Ima morda kdo kak pameten nasvet zame ??
Vsaka pomoc bi bila zelo dobrodosla.
  • spremenilo: CCfly ()

Jean-Paul ::

In v čem je težava?

Napišeš nekaj funkcij, ki vse sprejemajo enake argumente in vračajo rezultat istega tipa. Nato ustvariš polje kazalcev na funkcije in kazalcem prirediš naslove prej napisanih funkcij. Te funkcije lahko nato kličeš tako: ret = tab[4](argumenti);

Bo šlo?

P.S. Glede na tvoj opis naloge predpostavljam, da delate v C-ju.

snow ::

Kar ti je že Jean-Paul povedal, si lahko veliko bolj podrobno pogledaš tule. Predvsem koristno ti bo poglavje 2.8., ampak svetujem, da greš lepo po vrsti.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

miha22 ::

Saj to mi je jasno, ne vem pa kako naj dostopam do tabele sistemskih klicev(rutin) ter klicat primerne funkcije ven ?
ta tabela naj bi že bila zdefinirana ali naj bi jo sam ustvaril??

Jean-Paul ::

Glede na tvoj opis naloge sem sklepal, da je bistvo naloge v uporabi kazalcev na funkcije. (Mimogrede, na linku, ki ga je navedel snow, je ta tematika obravnavana res temeljito). Če želiš, da ti bo kdo lahko pomagal pri klicanju sistemskih funkcij, se boš moral pri razlagi naloge malo bolje potruditi. Najbolje, da prilepiš kar (izvirno) besedilo naloge.

sid_dabster ::

Bejzikli je zadeva takale (lahk de sm se kje zajebal - nisem preizkusil):

#include <stdio.h>

/*prototip handlerja:*/
typedef void(*handler)();

/*implementacija handlerjev*/
void handler1(){
  printf("Dule ");
}

void handler2(){
  printf("Savic ");
}

void handler3(){
  printf("je ");
}

void handler4(){
  printf("car!\n");
}

/*tabela handlerjev*/
handler handlers[]={
  handler1,
  handler2,
  handler3,
  handler4,
  NULL
};

/*pol jih pa klices, recimo kr v main funkciji:*/

int main(int argc, char* argv[]){
  
  for(unsigned i = 0; i<10; i++){
    unsigned j = 0;
    while(handlers[j]){
      handlers[j++]();
    }
  }

  return 0;
}

Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

miha22 ::

Kaj pa ce bi hotel jaz v tabelo dat funkcije kot so printf, getc, ..... ??

Vesoljc ::

potem je problem v tipu funkcij ter njihovih parametrih.

namrec, array necesa imas lahko le, ce je to "nekaj" enako (vsaj na zunaj!). kot ne mores imeti v arrayu mesanih tipov (int + float + char + etc...), ne mores imet razlicnih function ptr-jev (isti klinc).

lahko pa zadevo nekako "powrappas", tako da na zunaj zgleda enako. zdej v c++ to lepo resis z virtualnimi funkcijami, v pure c-ju, pa mi trenutnu pade na pamet samo void* >:D... bodo drugi bolje povedali.
Abnormal behavior of abnormal brain makes me normal...

miha22 ::

Saj to je meni jasno, ni mi pa jasno kako bi lahko delal preko take tabele razlicne sistemske klice.

snow ::

Sistemski klic je funkcija.

In tvoja naloga je, da iz nekega zaporedja, kličeš te sistemske klice(funkcije) iz arraya.
Kje je problem?

Če česa nisi dobil podanega v navodilu naloge, si verjetno izmisliš sam.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

miha22 ::

torej ce te prav razumem bi imel v funkcijah, ki bi jih dal v array:

void handler1(){
printf("Dule ");
}

void handler2(){
getc(nekaj);
}

void handler3(){
read...
}

nekaj takega?

miha22 ::

ceprav mislim da to ni ql. jaz bi v bistvu rabil en array in pol bi jaz recimo poklical 5. pozicjo v tem arrayu in bi ta pozicija poklicala recimo print funkcijo, recimo 10.pozicija pa read.... ( in to ne mislim neposredno z ukazi printf, read,... ampak posredno preko naslova)

Zgodovina sprememb…

  • spremenil: miha22 ()

miha22 ::

Naceloma mislim da sem stvar resil. Takoj ko se prepricam da je stvar ql, objavim resitev kle gor.
hvala vam za pomoc.:)

jernejl ::

Glede na to, kako si zastavil vprašanje, mi ni čisto jasno, ali moraš samo demonstrirati, kako delujejo sistemski klici (npr. z običajnimi kazalci na funkcije in izmišljenimi funkcijami), ali pa moraš dejansko uporabiti tabelo sistemskih klicev, kot jo pozna jedro operacijskega sistema.

Za OS Linux najdeš tabelo sistemskih klicev tule.
Še ena tabela je v tej pdf datoteki.

V C-ju lahko sistemske klice prožiš s funkcijo syscall. Primer, kako preko sistemskih klicev uporabiš ukaz chmod, je tukaj.

Za branje npr. iz standardnega vhoda bi tako lahko uporabil sistemski klic št. 3 (sys_read), za pisanje po zaslonu (izpis besedila, rezultatov...) pa sistemski klic št. 4 (sys_write).
Ta sistemska klica ustrezata C-jevskim funkcijam read in write (argumenti so enaki).

miha22 ::

Kot sem zastopil profesorja bi moral dejansko uporabiti tabelo sistemskih klicev, kot jo pozna jedro operacijskega sistema, ampak se je izkazalo da je dovolj ce samo demonstram, kako delujejo sistemski klici (npr. z običajnimi kazalci na funkcije in izmišljenimi funkcijami), hvala vam za vso pomoc.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c# kam lambda delegat shrani spremenljivke? (in njegov scope)

Oddelek: Programiranje
221822 (1380) Sportmania
»

Linux jedro z resno varnostno luknjo

Oddelek: Novice / Varnost
485057 (1883) 'FireSTORM'
»

[C] Sortiranje preštetih črk

Oddelek: Programiranje
6943 (779) BigBoobs
»

Array iz function pointer-jev

Oddelek: Programiranje
12721 (596) OwcA
»

Visual c++ Prekinitev programa

Oddelek: Programiranje
5579 (503) noraguta

Več podobnih tem