PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Der funktion system() ein Argument übergeben



Sector1379
07-11-2005, 19:01
Hallo zusammen,

ich habe mal eine kleine Frage an euch. Wie schaffe ich es der Funktion system() ein Argument übergeben ??? Ist das überhaupt möglich oder gibt es eine besser Funktion um ein Programm aus einem C Programm aufzurufen und diesem ein argument zu übergeben.

Gruß

Sector

Giuly
07-11-2005, 21:44
Hallo zusammen,

ich habe mal eine kleine Frage an euch. Wie schaffe ich es der Funktion system() ein Argument übergeben ??? Ist das überhaupt möglich oder gibt es eine besser Funktion um ein Programm aus einem C Programm aufzurufen und diesem ein argument zu übergeben.

Gruß

Sector


system("ls -la --color=tty");
Das wird alles per /bin/sh aufgerufen.

Sector1379
07-11-2005, 22:27
Hi

Danke für deine Antwort aber das war nicht ganz das was ich meinte. Also ich gebe mal ein Beispiel:

Ich rufe die Funktion wie folgt auf:

system("tar xjvf");

So, jetzt ist es ja so das hinter diesem Befehl der Dateiname normal kommen müßte und genau darauf bezieht sich meine Frage. Den Namen fange ich ab und speicher ihn in eine Variable. Nun will ich den Inhalt also den Namen an den System aufruf übergeben.

Also so würde man es dann per Hand in die Shell eingeben:

tar xjvf dateiname.tar.bz2

Und an dieser Stelle weiß ich nicht weiter.Wie genau macht man das ?? Ich hoffe ihr versteht wie ich das meine.

Gruß

Sector

Giuly
08-11-2005, 00:55
Hi

Danke für deine Antwort aber das war nicht ganz das was ich meinte. Also ich gebe mal ein Beispiel:

Ich rufe die Funktion wie folgt auf:

system("tar xjvf");

So, jetzt ist es ja so das hinter diesem Befehl der Dateiname normal kommen müßte und genau darauf bezieht sich meine Frage. Den Namen fange ich ab und speicher ihn in eine Variable. Nun will ich den Inhalt also den Namen an den System aufruf übergeben.

Also so würde man es dann per Hand in die Shell eingeben:

tar xjvf dateiname.tar.bz2

Und an dieser Stelle weiß ich nicht weiter.Wie genau macht man das ?? Ich hoffe ihr versteht wie ich das meine.

Gruß

Sector
C? C++?
Hier was in C:


char* dateiname="foo.tar.gz";
char* buf=malloc((9+strlen(dateiname))*sizeof(char));
sprintf(buf, "tar xvzf %s", dateiname);
system(buf);
free(buf);

Oder in C++:


std::string dateiname("foo.tar.gz");
system(std::string("tar xvzf "+dateiname).c_str());


C, wer lesen kann...

BLUESCREEN3D
08-11-2005, 17:37
char* buf=malloc((9+strlen(dateiname))*sizeof(char));
sprintf(buf, "tar xvzf %s", dateiname);
Böser Fehler: Du hast für das abschließende NULL-Byte keinen Speicherplatz reserviert!

Es müsste heißen:

char* buf=malloc((10+strlen(dateiname))*sizeof(char));

Allerdings würde ich für sowas eher strcat benutzen.

Sector1379
08-11-2005, 19:12
Vielen vielen dank Leute hat super geklappt.

Gruß Sector

Joghurt
10-11-2005, 17:16
char* dateiname="foo.tar.gz";
char* buf=malloc((9+strlen(dateiname))*sizeof(char));
sprintf(buf, "tar xvzf %s", dateiname);
system(buf);
free(buf);
Oder gleich
char *buf = malloc(1025);
snprintf(buf, 1024, "tar xvzf %s", dateiname);Statt malloc wäre natürlich alloca besser, aber leider ist die Funktion oft buggy.

Oder gleich char buf[1025];

panzi
13-11-2005, 23:29
Oder gleich
char *buf = malloc(1025);
snprintf(buf, 1024, "tar xvzf %s", dateiname);Statt malloc wäre natürlich alloca besser, aber leider ist die Funktion oft buggy.

Oder gleich char buf[1025];
Ich würde alloca garnicht erwähnen/vewrwenden, gibt zuviele probleme damit:

...
The inlined code often consists of a single instruction adjusting the
stack pointer, and does not check for stack overflow. Thus, there is
no NULL error return.

BUGS

The alloca function is machine and compiler dependent. On many systems
its implementation is buggy. Its use is discouraged.

On many systems alloca cannot be used inside the list of arguments of a
function call, because the stack space reserved by alloca would appear
on the stack in the middle of the space for the function arguments.

siehe man alloca (http://unixhelp.ed.ac.uk/CGI/man-cgi?alloca)