22. oktober 2002 - 10:07Der er
17 kommentarer og 1 løsning
Kørsel af program indeni andet program.
Kan man køre indefra et andet program. Vi forestiller os noget lignende det her: if(brugernavn=1){./lager} //her kører man programmet lager.c else {./klient} //her kører man programmet klient
vi forudsætter selvfølgelig at programmerne er kompileret. Hvordan kan man gøre dette?
Man kan selvfølgelig eksekvere en kompileret c-fil. eks. "gcc dumtSpoergsmaal.c -o mitProg" ville gøre det muligt at eksekvere mitProg ved at skrive "./mitProg". Til kørsel af programmer indeni andre programmer, kan man anvende funktionen "execl" eller en af dens ækvivalenter. For at se hvordan den virker kan I skrive "man execl". Hvis man eksempelvis vil afvikle filen "mitProg" ville syntaksen for "execl"-funktionskaldet se således ud:
int tmp = execl(stiTilMitprog/mitProg, mitProg, evtParametre, NULL);
tmp gemmer den integer, execl returnerer. Hvis den er -1 er operationen ikke lykkedes. Den første parameter skal indeholde den fulde ekserverbare sti, næste skal indeholde programnavnet i dette tilfælde "mitProg" - husk at den sidste parameter skal være en nullpointer ellers fungerer "execl" ikke.
En anden ting i skal være opmærksomme på er, at det oprindelige program stopper med at køre så snart I har kaldt execl, uanset returværdien i tmp. Hvis I ønsker at det oprindelige program stadig skal køre bagefter, kan I jo benytte fork(), som skaber en kopi at den nuværende proces. Lad barnet kalde "execl". Eks:
int tmp; pid_t forkTotaltAmok;
int main (bla bla) { if(enVariabel == 1) { forkTotaltAmok = fork(); if(forkTotaltAmok == 0) //barnet tmp = execl("mitProg", "mitProg", NULL); if(tmp == -1) printf(stderr, "fejl"); //else er det jo fint nok :D } }
Vær opmærksomme på at eksemplet forudsætter at det placeringen af det oprindelige program er den samme som det program, der skal "køres indeni det andet" :)
Jeres burde eksekvere klient.c og stoppe med at køre det oprindelige (fordi I ikke forker det inden, prøv at benytte "man execl" til at finde ud af om det er den rigtige "execl"-funktion I har brugt, måske skal I bruge noget exec, execp eller noget andet, brug "man". Check desuden om jeres klient.c i det hele taget virker inden i bruger et andet program til at afvikle det.
Vores program, der skal eksekvere klient.c hedder kør.c. Det kompilerer vi sådan: gcc -o kør kør.c. Er det den rigtige måde? Vi angiver desuden ingen sti, men det er fordi, at klient.c ligger i samme bibliotek som kør.c. Er det rigtigt nok?
gcc koer.c -o koer er den rigtige syntaks, husk desuden at det ikke er god stil at lave æ,ø,å i programmering. Det med stien lyder rigtigt nok, så jeg vil tro at hvis renamer kør.c til koer.c så burde det virke, for execl kan sikkert finde ud af ø'er. I afvikler "koer" ved at skrive "./koer".
Vi har nu prøvet: int tmp = execl("/stien/klient.c","klient.c",NULL);, og vi har lavet filen om til koer.c. execl returnerer stadig -1, så der bliver ikke eksekveret nogen fil. Har du nogen idé om, hvad det kan være?
Når i skriver tekst-konstanter i c, skal i huske at bagslag (backslash dvs. \-tegnet) har en speciel betydning, nemlig vi skrivning af kontrol tegn som f.eks. Carriage return (\r) og new-line (\n). Hvis du skal bruge selve bagslag'et, skal du skrive to bagslag efter hinanden. En alm. sti vil derfor se sådan her ud:
int tmp = execl("C:\\temp\\klient.exe", NULL);
Husk også på at der er .EXE filen som er et program, der kan køres - klient.c er kildeteksten til programmet, og den opfatter Windows som ren tekst. (Den kan man ikke køre.)
Vi har fået det til at fungere sådan: int tmp = execl("klient","klient",NULL);
"klient" er den kompilerede klient.c-fil
slashdotdoek vil du sende et svar, så du kan få point.
Synes godt om
Ny brugerNybegynder
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.