Ich will nur eine Variable ändern



  • Hallo zusammen,

    Ich will eine Variable in einem Programm bei der Laufzeit ändern.
    Der Wert dieser variable hängt sehr stark an die Algorithmen, Eingabedaten, Plattform... etc. Es ist sowieso nicht möglich in der Entwurfzeit den Wert dieser Variable festzulegen. Es ist sogar nicht sicher wann dieser Variable geändert werden muss.

    Zum Beispiel die Variable ist am Anfang 5. Ich werde bei der Laufzeit den Programm beobachten und irgendwann werde ich diese variable 3 machen. Es ist manchmal auch möglich, dass diese Variable bei der Laufzeit mehrmals geändert werden muss.

    Ich darf den eigentlichen Code der programm ändern oder eine neueprogramm schreiben, welche diese Variable verwaltet.

    Ich habe einige Ideen aber ich will eure schöne Ideen nicht beeinflussen.

    Vielen Dank



  • 😃 👍



  • Ich hoffe ihr könnt mein perfektes Deutsch verstehen.



  • Es ist ganz einfach:
    1. Variable definieren:

    int var; //bzw. int var = anfangswert;
    

    2. Wert zuweisen:

    var = 5; //5 nur als Beipsiel
    

    Ne, jetzt mal Spaß beiseite: Willst du uns verar*****? Variablen heißen ja grade "Variablen", weil ihr Wert variabel ist. Heißt: Wenn du sie nicht als const definierst kannst du ihren Wert beliebig oft ändern.

    P.S.: Bitte auf Signatur schauen.



  • Ich will dieser Variable bei der Ausführung der Programm ändern.

    zum Beispiel:

    int var; 
    main()
    {
    var=5 
    
    die Berechnungen
    
    }
    

    Man kompiliert dieses Code und führt es aus. Ein anderes Programm beobachtet diese Programm und merkt dass dieses Programm den Computer zu viel belastet. Deswegen muss diese Wert (var=5) nicht 5 sondern 3 sein. Zum Beispiel am Nacht hat der Computer nichts zu tun dann können wir diesen Wert 8 machen.
    Das heißt dieses variable muss bei der Laufzeit des Programms geäendert werden.

    Ich darf den eigentlichen kode des Programms auch ändern.

    Ich hoffe, ich konnte es jetzt erklären 🙂



  • Danke, die witzen sind echt super aber ich brauche Hilfe auch.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ja, sorry mal, aber du hast vorher nix verständliches geschrieben. Das Klang nähmlich wie: 'Ich bin ein Anfänger, hab mir ein C-Buch gekauft, habe aber keine Lust es durchzulesen. Aber ich weiß durchs Internet wie man Variablen definiert, hab aber keine Ahnung wie ich ihnen einen Wert zuweise. Ach, ich nerv am besten das nächstbeste Forum.'
    Aber jetzt kapier ich erstmal was du willst: Ein CPU-Auslastungsabhängiges Programm. Forumulier in Zukunft deine Probleme konkreter und verständlicher! Leider kann ich dir aber nicht weiterhelfen, da ich kein Linux hab. Aber das hat auch nix mit C zutun. Wird bestimmt bald von nem Mod verschoben.

    EDIT: 😡 Argh! Mod war schneller! 😉


  • Mod

    Eine recht einfache Methode wäre, wenn dein Programm einen Signalhandler installiert und ihm ein anderes Programm (zum Beispiel kill ) dann ein abgesprochenes Signal schickt, wenn es den Zustand ändern soll. Hier ein Beispiel (nicht 100% sauber, da ich schreibfaul war. Eigentlich solltest du noch die Masken oder mehrere Handler benutzen, damit mehrere, nahezu gleichzeitige, Ereignisse keine komischen Sachen machen):

    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    
    int value=5;
    
    void handler (int signum)
    {
      if (signum==SIGUSR1)
        printf("Decreasing value to %d\n",--value);
      else
        if (signum==SIGUSR2)
          printf("Increasing value to %d\n",++value);
    }
    
    int main (void)
    {
    
      struct sigaction action;
    
      action.sa_handler = handler;
      sigemptyset (&action.sa_mask);
      action.sa_flags = 0;
    
      sigaction (SIGUSR1, &action, NULL);
      sigaction (SIGUSR2, &action, NULL);
    
      for(;;)
        {
          printf("Value is %d.\n", value);
          sleep(3);
        }  
    }
    

    Programmname sei a.out. Programm starten. Auf anderer Konsole:

    $> ps aux |grep a.out
    1000     19100  0.0  0.0   3864   440 pts/12   S+   12:51   0:00 ./a.out
    1000     19102  0.0  0.0   7624   972 pts/13   S+   12:51   0:00 grep a.out
    $> kill -s SIGUSR1 19100
    $> kill -s SIGUSR1 19100
    $> kill -s SIGUSR1 19100
    $> kill -s SIGUSR2 19100
    $> kill -s SIGUSR2 19100
    $> kill -s SIGUSR2 19100
    $> kill -s SIGUSR2 19100
    $> kill -s SIGINT 19100
    

    Programmausgabe:

    Value is 5.
    Value is 5.
    Decreasing value to 4
    Value is 4.
    Decreasing value to 3
    Value is 3.
    Decreasing value to 2
    Value is 2.
    Increasing value to 3
    Value is 3.
    Increasing value to 4
    Value is 4.
    Increasing value to 5
    Value is 5.
    Increasing value to 6
    Value is 6.
    Value is 6.
    

    Wenn du das etwas gezielter mit dem Zuweisen von Werten möchtest, musst du dich mit der Interprozesskommunikation unter Linux beschäftigen. Oder auf jemanden warten, der dir das besser erklären kann als ich. Die obige Methode hat jedenfalls den großen Vorteil, sehr einfach zu sein und vielleicht reicht es ja schon.



  • linuxer schrieb:

    Ich darf den eigentlichen kode des Programms auch ändern.

    Wenn du das Programm verändern darfst, würde ich es an deiner Stelle so umschreiben, dass es sich selbst reguliert. D.h. einfach mit getloadavg (http://linux.die.net/man/3/getloadavg) die CPU-Last abfragen und dann die Variable entsprechend verändern (z.B. unter 0.3 erhöhen und über 0.7 verringern, bei einer CPU).
    Wenn es doch ein zweites Programm sein soll, ist die genannte Methode mit Signalen ganz gut - das zweite Programm fragt dann halt die Last ab.



  • Vielen Dank.

    1- Die beide Antworten sind sehr Hilfreich für mich. Ich werde höchstwahrscheinlich mit einem anderen Prgoramm getloadavg aufrufen dann eintsprechend ein Signal schicken.
    Meine Idee war die Speicheradresse der Variable in der Prgoramm abfragen und ausgeben. Danach bei der Ausführung des Programms mithilfe von einem anderen Programm diesen Speicher zugreifen und sein Wert ändern.
    Geht das auch?

    2- Gibt es überhaupt eine möglichkeit diesen Wert zu ändern, ohne den eigentlichen Code des Programms anzufassen?
    Kann ich irregendwie nur von außen diese Wariable ändern?
    Das wäre am besten für mich.

    Danke im Voraus


  • Mod

    linuxer schrieb:

    1- Die beide Antworten sind sehr Hilfreich für mich. Ich werde höchstwahrscheinlich mit einem anderen Prgoramm getloadavg aufrufen dann eintsprechend ein Signal schicken.
    Meine Idee war die Speicheradresse der Variable in der Prgoramm abfragen und ausgeben. Danach bei der Ausführung des Programms mithilfe von einem anderen Programm diesen Speicher zugreifen und sein Wert ändern.
    Geht das auch?

    Ja, das geht ist aber reichlich komplex und ich mag hier keinen Aufsatz darüber schreiben, wenn es nicht absolut notwendig ist. Die Idee ist, dass in Unix bekanntlich alles eine Datei ist, auch der virtuelle Speicher eines Prozesses. Mit ausreichend hohen Rechten (höhere Rechte als denen mit denen das Programm läuft, also in der Regel nur als Root) und den richtigen Betriebssystemfunktionen kannst du darauf zugreifen und sogar ändern. Dann musst du das Programm analysieren und gucken, an welcher Stelle genau die fragliche Variable steht (z.B. im Debugger gucken oder mittels Leet-Assembler-Skills direkt aus dem Compilat ablesen). Es geht wesentlich einfacher, wenn das Programm eine eigene Schnittstelle zur Verfügung stellt.

    2- Gibt es überhaupt eine möglichkeit diesen Wert zu ändern, ohne den eigentlichen Code des Programms anzufassen?
    Kann ich irregendwie nur von außen diese Wariable ändern?
    Das wäre am besten für mich.

    Ja, das wäre die gleiche Methode wie bei 1.



  • @SeppJ

    Ich würde sehr gerne dein Aufsatz lesen.

    Wir haben hier diskutiert. Deine Lösung ist am besten für uns. Es wäre auch super falls du kurz ein kleines beispiel schreibst.


  • Mod

    linuxer schrieb:

    @SeppJ

    Ich würde sehr gerne dein Aufsatz lesen.

    Wir haben hier diskutiert. Deine Lösung ist am besten für uns. Es wäre auch super falls du kurz ein kleines beispiel schreibst.

    Ich muss zugeben: Das kann ich nicht so aus dem Stand. Da müsste ich selber erst zu viel recherchieren, was du auch selber tun könntest. Ich weiß nur das die erste Anlaufstelle ptrace wäre und alles was danach kommt, ist extrem komplex und muss ich selber mit der Anleitung in der Hand schreiben.

    Ich weiß auch, dass dies in der Regel die Denkbar schlechteste Lösung für alles ist. Wenn ihr nicht gerade einen Debugger schreibt, würde es mich sehr wundern, wenn das bei euch anders wäre. Also: Was habt ihr überhaupt vor?



  • Also das mit der Adresse und dann einfach in den Speicher schreiben ist mal gar nicht die richtige Technik. Das Signal schon eher. Wobei anzumerken sei, dass man im Signalhandler so etwas wie printf nicht verwenden darf.

    Das Stichwort ist Interprozesskommunikation, aber dass hat SeppJ ja auch schon erwähnt. Und da gibt es verschiedene Möglichkeiten wie beispielsweise Shared Memory, Pipes oder Sockets.

    Eine recht einfache Variante ist einfach das lesen einer Datei. Eine Datei kann von einen anderen Prozess modifiziert werden und der zu steuernde Prozess kann diese Datei von Zeit zu Zeit lesen. Von dort kann der Wert für die Variable gelesen werden.


Log in to reply