[linux/C] uitvoeren van programma's met spaces

Pagina: 1
Acties:

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Ik heb onderstaand programma
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curses.h>

int main(int argc,int *argv[])
{
    char *d2k[2]= {"ls",NULL};
    char *d2k2[2]= {"ls -a",NULL};
    printf("1 :%s\n",d2k[0]);
    printf("2 :%s\n",d2k2[0]);
    execvp(d2k[0],d2k); //voert ls uit
    execvp(d2k2[0],d2k2); //voert ls -a niet uit    
    return(0);
}

Dan wordt de eerst netjes uitgevoerd maar de 2e met de spaties niet. (nee het is geen volgorde probleem, heb ze ter demo onder elkaar gezet :) ).

uitvoer
code:
1
2
3
1: ls
2: ls -a
<dir zooi die ls oplevert>

dus mijn vraag is wat kan ik aan die spaces doen zodat mijn commando's wel uigevoerd worden?

Doet iets met Cloud (MS/IBM)


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16:30

Janoz

Moderator Devschuur®

!litemod

code:
1
char *d2k2[2]= {"ls -a",NULL};

Wild guess... ls -a zijn 5 characters?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 11:44 schreef Janoz het volgende:
code:
1
char *d2k2[2]= {"ls -a",NULL};

Wild guess... ls -a zijn 5 characters?
helaas
al maak ik er 20 van werkt het nog niet

Doet iets met Cloud (MS/IBM)


  • [ti]
  • Registratie: Februari 2000
  • Niet online
int execvp(const char *file, char *const argv[]);
dus:
code:
1
2
char *d2k2[2]= {"-a",NULL};
execvp("ls", d2k2);

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Het eerste wat ik zou proberen is ls -a tussen quotes te zetten. Dus dan krijg je zoiets:

char *d2k2[2] = {"""ls -a""", NULL};

He who knows only his own side of the case knows little of that.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 11:47 schreef RickN het volgende:
Het eerste wat ik zou proberen is ls -a tussen quotes te zetten. Dus dan krijg je zoiets:

char *d2k2[2] = {"""ls -a""", NULL};
parse error

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 11:47 schreef [ti] het volgende:
[..]
dus:
code:
1
2
char *d2k2[2]= {"-a",NULL};
execvp("ls", d2k2);

dat werkt wel
ff verder klooien
tnx

ho
dat doet alleen ls
en niet ls -a

Doet iets met Cloud (MS/IBM)


Verwijderd

Is er geen exec variant die argv als parameter heeft?
In minix bestaat deze namelijk wel, dus waarschijnlijk ook in linux.

Wat gebeurt er eigenlijk als je "ls -a" uitvoert?
Krijg je dan een error of wordt alleen "ls" uitgevoerd?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 11:53 schreef Los_Bastardos het volgende:
Is er geen exec variant die argv als parameter heeft?
In minix bestaat deze namelijk wel, dus waarschijnlijk ook in linux.

Wat gebeurt er eigenlijk als je "ls -a" uitvoert?
Krijg je dan een error of wordt alleen "ls" uitgevoerd?
er gebeurt dan nix

en over die variant: als jij hem weet graag
want nu fake ik het hardcoded maar het moet strax een commandline optie worden uiteraard

Doet iets met Cloud (MS/IBM)


  • [ti]
  • Registratie: Februari 2000
  • Niet online
My bad. Dit werkt wel:
code:
1
2
3
4
5
6
7
#include <unistd.h> 

int main(int argc, char *argv[])
{
  char *d2k2[3]= {"ls","-a",NULL};
  execvp("ls", d2k2);
}

argv[0] moet dus hetzelfde zijn als je commando.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 11:57 schreef [ti] het volgende:
My bad. Dit werkt wel:
code:
1
2
3
4
5
6
7
#include <unistd.h> 

int main(int argc, char *argv[])
{
  char *d2k2[3]= {"ls","-a",NULL};
  execvp("ls", d2k2);
}

argv[0] moet dus hetzelfde zijn als je commando.
dat wou ik ook net gaan posten :)
dat werkt idd wel

dan die char maar ff in een loop vullen met argv[] denk ik

Doet iets met Cloud (MS/IBM)


  • Knorrend_varken
  • Registratie: Juni 2000
  • Laatst online: 19:43
Volgens mij overschrijft execvp het hudige proces, dus na de eerste execvp keer je niet meer terug in main().

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
Op donderdag 13 december 2001 12:22 schreef Knorrend_varken het volgende:
Volgens mij overschrijft execvp het hudige proces, dus na de eerste execvp keer je niet meer terug in main().
guess again
lezen mag wel ff hoor voor je post :)
had het er niet voor nix ingezet
Op donderdag 13 december 2001 11:38 schreef D2k het volgende:
(nee het is geen volgorde probleem, heb ze ter demo onder elkaar gezet :) ).

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
zo ik ben de rotste niet dus hier de uiteindelijke oplossing :)
misschien heeft iemand er ooit nog iets aan
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
**************************************************************************
* Datum      : 14-12-2001   Project    : Onderzoek         *
* Versienummer    : V 0.1                           *
* Opdrachtscoord. :          Opsteller  : D2k              *
**************************************************************************
*/
//includes
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//einde includes

//constanten (geen defines ivm typechecking)
const int nbOfCmds = 20;            //aantal structs
const int szOfCmds = 50;            //groootte van de struct stCommands
//einde constanten

struct stCommands
{
    char text [szOfCmds];            //hier komen de parameters in te staann
    stCommands :: stCommands (void)  //constructor. Maak alle elementen leeg
    {
       text [0] = '\0';
       }
}; 

stCommands cmd [nbOfCmds];           //maak een struct cmd aan

int main(int argc,char *argv[])         //main met argumenten
{
    int argumenten_teller,          //argumenten teller van de invoer
        index_teller,           //teller om door de struct te lopen
        programma_teller=0;     //telller om de programma elementen te setten
      char *uitvoeren[nbOfCmds];        //pointer naar uit te voeren argumenten
    
    if(argc>1)              //controleren of er argumenten zijn opgegeven om uit te voeren
      {
          for(argumenten_teller=0;argumenten_teller<argc;argumenten_teller++)
          {
                strcpy (cmd [argumenten_teller].text, argv [argumenten_teller]); //invoer in de struct zette
        }
    }
    else                     //geen invoer gegeven, even uitleggen hoe het wel moet
    {
        printf("Minimaal 1 argument meegeven aan %s.\n",argv [0]);
        exit(1);            //programma beeindigen
    }
    
    for (index_teller = 0; index_teller < nbOfCmds; index_teller ++)
    {
        if(strcmp(cmd[index_teller].text,"\0"))
        {
            uitvoeren[programma_teller]=cmd[index_teller+1].text; //als er invoer is de pointer laten wijzen
            programma_teller++;
        }
    }
    uitvoeren [programma_teller-1] = NULL;  //afsluiten met NULL ivm execvp 
    execvp( uitvoeren [0], uitvoeren);  //het uitvoeren van de commando's
}

Doet iets met Cloud (MS/IBM)


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Mooi programma verder, maar ik heb 1 puntje van commentaar: je commentaar in de source :) Als je je source voorziet van comment moet je niet proberen uit te leggen WAT je doet (dat kun je aan de source ook wel zien) maar WAAROM je iets doet.

//includes
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//einde includes

Die 2 regels commentaar zijn volstrekt nutteloos. Als je die dingen wil scheiden is het beter om dat te doen met iets als:

//--------------------------------------------------


Nog 1 vb:

exit(1); //programma beeindigen

Als je c programmeert, behoor je te weten wat exit() doet, dus die regel commentaar heeft niet echt veel zin. Beter zou zijn:

exit(1); // er zijn niet genoeg argumenten: afsluiten.

In dit geval een beetje dubbel omdat de printf() regel met de uitleg erboven staat, maar you catch my drift :p

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19
hijs overgecomment dat geef ik gelijk toe :)
maar zo levert het nog iets op voor het nageslacht :P

Doet iets met Cloud (MS/IBM)

Pagina: 1