Forum: PC-Programmierung C-Applikation aus laufendem Code neu starten


von Felix (Gast)


Lesenswert?

Mahlzeit,

wir sind gerade dabei eine Software, welche für ein Controller 
geschrieben wurde auf x86 umzuschreiben. Diese soll dann zum testen usw. 
genutzt werden.
Jetzt gibt es dort eine Funktion einen Reset zu machen.
Ist so etwas in Linux irgendwie möglich?
ich müsste ja quasi die main wieder aufrufen. Wobei dann ja noch alle 
variablen (statische) erhalten bleiben? Diese müssten ja natürlich auch 
zurückgesetzt werden.
Gibt es in Linux eine Funktion um eine C-Applikation neu zu starten (aus 
laufendem Code heraus)

von leo (Gast)


Lesenswert?

Felix schrieb:
> Ist so etwas in Linux irgendwie möglich?
> ich müsste ja quasi die main wieder aufrufen.

man exec

e.g. https://stackoverflow.com/questions/10206190/restart-program-in-c

leo

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Einfach das Program beenden (exit()) und die Programm-Ausführung von 
einem Script aus in eine Schleife einbetten, wäre eine einfache 
Möglichkeit.

von Witzbold (Gast)


Lesenswert?

> Program beenden (exit()) und die Programm-Ausführung von
> einem Script aus in eine Schleife einbetten

&

> Wobei dann ja noch alle variablen (statische) erhalten bleiben?

Wohl eher nicht.

Ganz primitiv:

main(){
  reset:

  ...
  ...
  ...
  goto reset;
  ...
}

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Es fragt sich halt, wie viel davon beim Start neu initialisiert wird, 
und in wie fern das gleich wie beim Controller ist. Man könnte in der 
main ein setjmp, und als reset dann nen longjmp machen. Jenachdem kann 
man auch früher ansetzen: 
https://linux.die.net/man/1/ld#:~:text=-init=name

Inwieweit das nachher aber vergleichbar mit dem Controller ist, kann ich 
nicht sagen.

von Programmierer (Gast)


Lesenswert?

Alles viel zu kompliziert. exec() ist die richtige Antwort.
1
int main (int argc, char* argv) {
2
  ...
3
  // Programm neustarten
4
  execvp (argv [0], argv);
5
}

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Eventuell stat argv[0] "/proc/self/exe" nehmen. Das sollte dann 
eigentlich selbst falls argv[0] anders gesetzt wird oder die Datei 
verschoben oder gelöscht wurde noch gehen. Durch ne neue Version 
ersetzen und die laden geht dann halt aber nicht.

von Dirk (Gast)


Lesenswert?

Ihr habt doch sicherlich ein Loggingsystem laufen, wieso nicht darauf 
triggern und die Applikationen killen und neustarten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.