Dateideskriptor in C



  • FILE* my;    
            my = fopen("dummy", "w+");
            my->_file = dateideskriptor;
    


  • danke, das sieht schonmal gut aus aber die funktion (C) soll ja den deskriptor erhalten.

    int func(int descr)
    {
        FILE *datei;
        datei->_file=descr;
        datei=fopen(...,"r");
    

    so in etwa sollte das dann aussehen, nur wird ja bei fopen ein FILE pointer erwartet, und kein int-wert. davon abgesehen ist xxx->_file bei mir immer ==3...



  • guckst du: http://docs.python.org/lib/bltin-file-objects.html
    da steht:

    File objects are implemented using C's stdio package...

    demnach könnte es vielleicht so gehen:

    void meine_c_funktion (int phyton_file_descriptor) // eventuell long statt int nehmen
    {
      FILE *c_filepointer = (FILE*)phyton_file_descriptor;
    
      // ab hier c-funktionen mit c_filepointer benutzen.
      ...
    }
    


  • recht herzlichen dank, jetzt siehts doch schon viel besser aus 😉



  • war wohl doch etwas zu voreilig...
    @ net, wenn ich deinen Beitrag richtig verstanden habe dann lass dir mal folgenden Code auf der Zunge zergehn 😉 :

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int getc2(int b)
    {
        FILE *file=(FILE*) b;
        return getc(file);
    };
    
    int main()
    {
        FILE *file=fopen("C:\\text.txt","r");
        if (file==NULL) exit(1);
        int a=(int) file;
        printf("%d\n",file->_file);
        printf("%d\n",a);
        printf("%d\n%c",getc2(a),getc2(a));
        getch();
        fclose(file);
    };
    

    was hier gemacht wird ist nur (sinnloses) typecasting: man wandelt den FILE pointer in ein int-wert um (NICHT der dateideskriptor) und übergibt diesen der funktion. innerhalb der funktion wandelt man diesen wieder in einen FILE pointer um und erhält somit (man sollt's kaum glauben ;)) das file-handle wieder...

    die 4 ausgaben sind: der wahre filedeskriptor, so wies seepferd beschrieben hat, dannach der file pointer als int-wert und dann noch das erste zeichen als ASCII wert bzw. zeichen.

    seepferd war auch am nächsten dran, allerdings moechte ich ja aus dem deskriptor den FILE pointer bekommen, bei ihm wars genau andersrum.



  • seepferd schrieb:

    FILE* my;    
            my = fopen("dummy", "w+");
            my->_file = dateideskriptor;
    

    ⚠ Das ist Super Unportabel! So was macht man nicht! Unter POSIX-Systemen gibt es man: fileno(3) dafür.



  • plankton schrieb:

    was hier gemacht wird ist nur (sinnloses) typecasting: man wandelt den FILE pointer in ein int-wert um (NICHT der dateideskriptor)

    naja, war nur ein versuch. hätte ja klappen können.
    solange wir nicht genau wissen was ein 'dateidescriptor' in phyton ist, können wir nur raten. der text 'File objects are implemented using C's stdio package' liess mich annehmen, dass es so klappen könnte...



  • sorri verpennt. wusste nicht ob sowas in C moeglicherweise auch gelaeufig ist.

    dazu was aus einem python forum:

    BlackJack schrieb:

    Ein Dateideskriptor ist eine Zahl die zusammen mit einer Prozess-ID eine offene Datei bestimmt. Das heisst so ein Deskriptor hat nur in einem laufendem Prozess eine Bedeutung und kann nicht an einen anderen weitergegeben werden.

    sowas wird an die funktion übergeben, und ich will den dazugehoerigen FILE pointer erhalten, da die meisten funktionen mit dem deskriptor nix anfangen koennen.

    hab hier noch was dazu gefunden, komme aber nicht so ganz damit klar:
    http://www.win.tue.nl/~aeb/linux/vfs/trail-2.html

    waere euch dankbar wenn mir das jemand erklaeren koennte, vorrausgesetzt da steht die antwort drin.



  • steht auf der seite deren link ich vorhin gepostet habe:

    fileno( )
    Return the integer ``file descriptor'' that is used by the underlying implementation to request I/O operations from the operating system. This can be useful for other, lower level interfaces that use file descriptors, such as the fcntl module or os.read() and friends. Note: File-like objects which do not have a real file descriptor should not provide this method!



  • @ net: ne, die funktion erhaelt den filedescriptor und innerhalb der funktion werden funktionen wie fgets, getc usw. aufgerufen. dafür muss ich aus dem filedescriptor einen FILE pointer machen!

    hab die beiden funktionen noch gefunden:

    #include <stdio.h>
    
    FILE *fdopen(int fildes, const char *type);
    
    #include <fildes.h>
    FILE *f = fileptr( fd );
    

    GENAU das brauche ich, nur für windows oder noch besser: platformübergreifend

    hier erhaelt man den FILE pointer zu einer geoeffneten datei.



  • ups, mit fdopen klappts ja doch 🙄
    aber trotzdem danke ans forum


Anmelden zum Antworten