Zwei Systembefehle direkt hintereinander - Zeitproblem?

Herakles

Profifragensteller
Moin!

Ich möchte zwei Systembefehle ausführen, die im Code meines C++ Programms direkt hintereinander stehen. Folgender Code:

Code:
 char syscom[500];
  sprintf ( syscom, "cp %s/%s %s/BestGeometry.stu", path2results, CPFile, path2results );
  system(syscom);
  sprintf ( syscom, "chmod 744 %s/BestGeometry.stu", path2results );
  system(syscom);

Würde ein derartiger Code funktionieren? Oder könnte es passieren, dass der Rechner den ersten Befehl nicht zu Ende ausführt und stattdessen gleich den nächsten beginnt, obwohl der erste noch nicht fertig ist?

Grüße, Herakles
 
Ich denke mal das sprintf darauf wartet wis das aufgerufene Programm terminiert. Also sollte es doch kein Problem sein.
 
Maledictus schrieb:
system(3) muss garnichts. Wenn der Prozess daemonized dann kommt system(3) auch vor ende des Prozesses zurück :P

tib schrieb:
system muss warten bis der Befehl fertig ist

system(3) schrieb:
The calling process waits for the shell to finish executing the command, ignoring SIGINT and SIGQUIT, and blocking SIGCHLD.

Ergo: system muss warten bis der Befehl fertig ist. Befehl (command) != Prozess.
 
Maledictus schrieb:
Code:
char syscom[500];
syscom[500] = '\0';
au.
Das hilft gar nix wenn man nicht auch snprintf statt sprintf benutzt. Und ausserdem ist das letzte byte im puffer byte nummer 499. Wir fangen schliesslich von 0 an zu indizieren ;)

EDIT: oh, du hast dich auf die "korrigierte" version bezogen, nicht auf das original - /me geht jetzt ins bett...
 
Zuletzt bearbeitet:
Ich seh keine korrigierte Version. ;)
Wie dem auch sein, ein fork() und anschliessendes execve() sollte besser sein, zumal man dann auch mitbekommt, wenn der Befehl beendet wurde.

Wenn Du allerdings diese beiden Befehle ausfuehren willst, geht's vielleicht auch besser. Das Kopieren schlimmstenfalls von Hand kodieren und AFAIK ist chmod() ein System-Call, den Du direkt als C-Funktion aufrufen kannst. Das ist auf alle Faelle besser als dies snprintf() Zeuchs.
Wobei snprintf() sicherlich noch die beste Variante ist, wenn man nicht selbst ausserhalb vom Array schreibt. ;)
 
@tib
Vielen Dank für Deine freundliche und Hilfsbereite Mitteilung -- Du bist eine große Bereicherung für das Forum.

1) snprintf sorgt selbstständig für eine NUL-Terminiertung des Strings, so daß man das nicht nochmals per hand machen sollte.

2) Wenn sichergestellt ist, daß die Zeichenkette für syscom nie größer als das Limit wird, kann sprintf bedenkenlos eingesetzt werden. Doppelte Überprüfungen führen zu nichts; für spätere Erweiterungen muss ein Vormerk in der Doku sein.

3) Wenn wir alle so göttlich programmieren könnten wie Du, bräuchten wir diesen Teil des Forum nicht.

@Herakles
schau dir mal die anoncvssh von OpenBSD an. Die ist klein und übersichtlich und war mir eine große Hilfe, zu sehen, wie man exec*() verwendet.
Du muß vorher allerding, wie schon gesagt forken. Am elegantesten ist es, wenn Du alles in einem eigenen Modul hast und via mysystem(command); zugreifst.


Ciao
PhysChemist
 
Zurück
Oben