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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Felix (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Alles viel zu kompliziert. exec() ist die richtige Antwort.
int main (int argc, char* argv) {
  ...
  // Programm neustarten
  execvp (argv [0], argv);
}

von 🐧 DPA 🐧 (Gast)


Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.