tomm: require umsetzung in C

Hi,

also ich stehe vor einem Problem. Naja eigentlich will ich nur was wissen.

Kann man folgenden Code auch in C/C++ umsetzen?

  
<?php  
  
$var = $_GET['site'].'.php';  
require_once($var);  
  
?>  

In PHP geht das ohne Probleme da es dem PHP-Interpreter ziemlich egal ist welchen Code er nun ausführt.
Aber in C ist das ganz und gar nicht egal.
In C habe z. B. folgende Möglichkeit:

  
#include "irgendeinedatei.h"  

Aber dann wird kompiliert und die Datei ist fest im Programm.

Wenn man aber nun animmt ich möchte unbedingt das PHP-Beispiel oben in C realisieren. Wie würdet ihr das angehen?
Für jede Datei eine Funktion anlegen und die Funktion aufrufen anstatt die entsprechende Datei zu includieren?

Ich habe momentan noch keinen so rechten Plan wie ich das realisieren soll, aber es wäre echt cool wen mir von euch jemand auf die Sprünge helfen könnte.

Grüße, Tom

  1. Ich habe momentan noch keinen so rechten Plan wie ich das realisieren soll, aber es wäre echt cool wen mir von euch jemand auf die Sprünge helfen könnte.

    Mal abgesehen davon, dass dein Beispiel eine extreme sicherheutslücke darstellt. Solltest du dir den Unterschied zwischen einer kompilierten und einer Skriptsprache verinnerlichen.

    Du kannst in C nicht zur Laufzeit beliebigen Quellcode einbinden.

    Struppi.

    1. Du kannst in C nicht zur Laufzeit beliebigen Quellcode einbinden.

      1. Ist das nur einfacher Code der nur das veranschaulicht um was es mir geht

      2. Habe ich bereits in meinem Posting deutlich gemacht das ich sehr wohl den Unterschied zwischen einer Skriptsprache und einer Programmiersprache kenne und auch nur deswegen nach einer Möglichkeit suche sowas trotzdem in C zu realisieren.

      Wen jemand einen anderen Vorschlag als Funktionen hat ...

        1. Ist das nur einfacher Code der nur das veranschaulicht um was es mir geht

        Dann veranschaulicht er nicht was du willst.

        1. Habe ich bereits in meinem Posting deutlich gemacht das ich sehr wohl den Unterschied zwischen einer Skriptsprache und einer Programmiersprache kenne und auch nur deswegen nach einer Möglichkeit suche sowas trotzdem in C zu realisieren.

        Was ist denn sowas?
        Du kannst, wie du bereits schriebst, Bilbiotheken mit #include mit übersetzen, zur Laufzeit gibt es auch Techniken, aber davon ist nichts vergleichbar mit einem include vergleichbar.

        Wen jemand einen anderen Vorschlag als Funktionen hat ...

        Für was?

        Struppi.

      1. Hi!

        1. das ich sehr wohl den Unterschied zwischen einer Skriptsprache und einer Programmiersprache kenne

        Eine Scriptsprache ist auch eine Programmiersprache.

        und auch nur deswegen nach einer Möglichkeit suche sowas trotzdem in C zu realisieren.

        Das Einbinden mittels #include wird vom Präprozessor durchgeführt.
        Das findet vor dem Compilieren statt und nicht zur Laufzeit.
        Du hättest zwar auch die Möglichkeit mit Makros zu arbeiten und so bedingte Kompilierung zu basteln, aber wie gesagt: nicht zur Laufzeit.
        Ein C-Programm muß compiliert werden. Der einzubindene Code muß also bereits vor der Compilierung eingebunden werden. Zur Laufzeit kann das nicht mehr funktionieren.
        Du mußt die Sache also anders angehen.
        Man hat dich bereits auf die dynamische Bibliotheken hingewiesen.
        So würde ich die Sache vermutlich auch angehen.

        Vielleicht solltest du mal genauer beschreiben, was du eigentlich vor hast.
        Dann kann man dir auch genau sagen, wie du die Sache am besten angehen könntest.
        Handelt es sich bei deinem C-Programm um ein CGI-Programm?

        Schöner Gruß,
        rob

        1. Vielleicht solltest du mal genauer beschreiben, was du eigentlich vor hast.
          Dann kann man dir auch genau sagen, wie du die Sache am besten angehen könntest.
          Handelt es sich bei deinem C-Programm um ein CGI-Programm?

          Nein es ist definitiv kein CGI-Programm.

          Das Programm soll eher aus vielen Dateien bestehen wobei es keinen Sinn macht diese mit #include einzubinden da sie genau so funktionieren sollen wie mein PHP-Beispiel. Die Datei wird eingebunden und ausgeführt.
          Und das unter C.
          Wie das mit den Bibliotheken funktionieren soll ist mir nicht ganz klar aber ich denke auch das sie nicht mein Problem lösen werden.
          Ich dachte vielleicht eher an die umständliche Weise jede Datei in eine Funktion zusammenzufassen und die Funktionen dieser Datei eben aus der Funktion herauszunehmen, da man in Funktionen keine Funktionen definieren kann.
          Wie soll ich das nun angehen?

          1. Wie das mit den Bibliotheken funktionieren soll ist mir nicht ganz klar aber ich denke auch das sie nicht mein Problem lösen werden.

            D.h. du hast es probiert und es hat nicht geklappt?

            Ich dachte vielleicht eher an die umständliche Weise jede Datei in eine Funktion zusammenzufassen und die Funktionen dieser Datei eben aus der Funktion herauszunehmen, da man in Funktionen keine Funktionen definieren kann.

            Du redest wirr.
            Dir wurden doch bereits alle Möglichkeiten genannt, wie du dein Probleme lösen könntest. Es gibt in C keine direkte Möglichkeit zur Laufzeit Bibliotheken einzubinden, was daran liegt das das eine eben ein Skriptsprache ist und C nicht. Punkt.

            Struppi.

          2. Hi!

            Wie das mit den Bibliotheken funktionieren soll ist mir nicht ganz klar aber ich denke auch das sie nicht mein Problem lösen werden.

            Wenn du Funktionen auslagerst (unter Windows in DLLs), wäre es möglich, diese zur Laufzeit zu laden.

            Ich dachte vielleicht eher an die umständliche Weise jede Datei in eine Funktion zusammenzufassen und die Funktionen dieser Datei eben aus der Funktion herauszunehmen, da man in Funktionen keine Funktionen definieren kann.

            Das verstehe ich nicht...

            Ich denke, daß es wahrscheinlich das Beste ist, wenn du mit dynamischen Bibliotheken arbeitest.
            Aber genau kann ich das nicht sagen. Wenn du genau erklären würdest, was du denn jetzt eigentlich machen willst, dann kann man dir auch die Möglichkeiten aufzeigen.
            Das habe ich aber bereits schon einmal geschrieben...

            Schöner Gruß,
            rob

  2. Hallo Tom,

    Ich habe momentan noch keinen so rechten Plan wie ich das realisieren soll, aber es wäre echt cool wen mir von euch jemand auf die Sprünge helfen könnte.

    [x] Du möchtest dich mit dynamischen Bibliotheken vertraut machen.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
  3. Hallo,

    <?php

    $var = $_GET['site'].'.php';
    require_once($var);
    ?>

      
    reduzieren wir das mal auf die Kernanforderung: Du möchtest ein Stück Programmcode einbinden; die Entscheidung, welches Stück Code das ist, fällt aber erst zur Laufzeit.  
      
    Wenn wir mal annehmen, dass die Auswahl der zur Verfügung stehenden Code-Bausteine begrenzt ist, könntest du jedes "Include"-File als separate Bibliothek übersetzen und zur Laufzeit des Programms dynamisch einbinden. Diese Technik ist in praktisch allen Betriebssystemen anwendbar; unter Windows heißen solche Bibliotheken beispielsweise DLL (Dynamic Link Library), und die wichtigsten Funktionen zum Umgang mit DLLs sind LoadLibrary() und GetProcAddress().  
      
    
    > Für jede Datei eine Funktion anlegen und die Funktion aufrufen anstatt die entsprechende Datei zu includieren?  
      
    Solange der Umfang überschaubar bleibt, wäre das auch eine Möglichkeit, und wahrscheinlich sogar effizienter.  
      
    So long,  
     Martin  
    
    -- 
    Man sollte immer wissen was man sagt  
     - aber auf keinen Fall alles sagen, was man weiß.
    
    1. unter Windows heißen solche Bibliotheken beispielsweise DLL (Dynamic Link Library), und die wichtigsten Funktionen zum Umgang mit DLLs sind LoadLibrary() und GetProcAddress().

      FreeLibrary() nicht zu vergessen. ;-)

      Unter POSIX (Linux, *BSD, ...):

      #include <dlfcn.h>

      void *dlopen(const char *filename, int flag);

      char *dlerror(void);

      void *dlsym(void *handle, const char *symbol);

      int dlclose(void *handle);

      GNU Extensions:

      int dladdr(void *addr, Dl_info *info);

      void *dlvsym(void *handle, char *symbol, char *version);

      Siehe http://www.die.net/doc/linux/man/man3/dlopen.3.html

      Für jede Datei eine Funktion anlegen und die Funktion aufrufen anstatt die entsprechende Datei zu includieren?

      Solange der Umfang überschaubar bleibt, wäre das auch eine Möglichkeit, und wahrscheinlich sogar effizienter.

      Mit dem Preprozessor und einem gut ausgetüfteltem Makefile ist das kein großes Problem, ein Beispiel für diese Technik ist busybox.

      Alexander

      1. Hi Alexander,

        unter Windows heißen solche Bibliotheken beispielsweise DLL (Dynamic Link Library), und die wichtigsten Funktionen zum Umgang mit DLLs sind LoadLibrary() und GetProcAddress().

        FreeLibrary() nicht zu vergessen. ;-)

        völlig richtig - ich hatte es hier nicht erwähnt, da es fürs Funktionieren und für das Verständnis nicht lebenswichtig ist. Es gehört natürlich zum guten Programmierstil, verwendete Ressourcen auch wieder freizugeben, aber beispielsweise FreeLibrary() führt Windows implizit automatisch aus, wenn der Prozess beendet wird, die die DLL geladen hat.

        So long,
         Martin

        --
        Success should be measured not so much by the position that one has reached in life,
        but by the obstacles one has overcome while trying to succeed.
  4. Vielleicht hilft dir das http://sourceforge.net/projects/binaryphp/
    weiter auch bei anderen PHP2C++ Umsetzungen.

    Timo