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?
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
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.