Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 10:07 Der 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?
Avatar billede soreno Praktikant
22. oktober 2002 - 10:11 #1
(forudsat at du snakker om kørsel af eksekverbare filer) eks. med system:
#include <stdlib.h>

int main(int argc, char **argv)
{
  int brugernavn = 112;
  if(brugernavn == 112)
    system("notepad.exe");
  else
    system("regedit.exe");

  return 0;
}
Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 11:36 #2
Vi vil gerne køre c-filer. Kan man det, eller kan man lave dem om til exe-filer?
Avatar billede kamikaze Nybegynder
22. oktober 2002 - 12:38 #3
Du kan ikke "køre" en c-fil. Den skal kompileres og laves til en .exe-fil først.
Avatar billede kamikaze Nybegynder
22. oktober 2002 - 12:40 #4
SE: http://www.eksperten.dk/spm/202384

Her er kode til forskellige måde at eksekvere et program på...
Avatar billede slashdotdoek Nybegynder
22. oktober 2002 - 12:59 #5
Vejledning til C.

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" :)

hygge.
Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 13:59 #6
vi skriver:
#include <unistd.h>

main()
{
int tmp = execl(/home/bib/g1/klient.c, klient.c, NULL);
}

men den klager så over den første skråstreg. Hvordan skriver man stien?
Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 14:04 #7
vi har fundet ud af det andet. Nu skriver vi:
...

int tmp = execl("klient.c","klient.c",NULL);
...
Nu kompileres og køres programmet, men det lukker bare uden at eksekvere klient.c?
Avatar billede slashdotdoek Nybegynder
22. oktober 2002 - 15:43 #8
helt sikkert!
Avatar billede slashdotdoek Nybegynder
22. oktober 2002 - 15:50 #9
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.
Avatar billede slashdotdoek Nybegynder
22. oktober 2002 - 15:51 #10
sørg desuden for at stien er rigtig...
Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 16:46 #11
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?
Avatar billede slashdotdoek Nybegynder
22. oktober 2002 - 17:09 #12
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".

hygge.
Avatar billede lasse_hyldal Nybegynder
22. oktober 2002 - 18:42 #13
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?
Avatar billede slashdotdoek Nybegynder
23. oktober 2002 - 12:56 #14
ja... i skal jo huske at kompilere det program, der skal afvikles i det andet program, m.a.o kompilér klient.c !
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:08 #15
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.)
Avatar billede slashdotdoek Nybegynder
23. oktober 2002 - 14:21 #16
ja...men nu er det formentlig linux, der er tale om :p, ellers er den med backslash '\' god nok
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:43 #17
slashdotdoek >> Skrives "path"erne ikke med backslash der ?

Derfor er det stadig .exe filen der skal køres.
Avatar billede lasse_hyldal Nybegynder
23. oktober 2002 - 16:41 #18
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.
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