2016-05-26 13 views
2

Ich versuche einen Systemaufruf zu machen, der die Inode-Nummer einer Datei zurückgibt, und wählte die FTS und FTSENT Strukturen, da ich sie während der Suche gefunden habe und sie auch in verwendet werden ls.c (von dem üblichen ls Programm, das mit -i gibt uns die Inode-Nummern).Minix: undefinierte Distanz zu __fts_open60

Um Dinge dicht gepackt zu halten, fügte ich die beiden Funktionen in der Unterseite table.c in hinzu.

Dies ist der Fehler (der Vollständigkeit halber):

table.o: In function 'do_inode_nr': 
table.c:(.text+0x1f): undefined reference to __fts_open60 
table.c:(.text+0x50): undefined reference to __fts_read60 
clang: error: linker command failed with code 1 (use -v for invocation) 

ich nicht -v verwenden kann, weil ich mit make hdboot aus /usr/src/releasetools Gebäude bin.

Der Code:

//forward declaration of the functions before the table itself 
//table and default stuff 

//after all this 
#include "fts.h" 

int do_inode_nr() 
{ 
    FTS* s = fts_open(&m_in.m1_p1, 0, NULL); 
    printf("%s", s? "got inode\n" : "failed to get inode\n"); 
    if(s == NULL) return -1; 
    FTSENT* p = fts_read(s); 
    printf("%d", p->fts_ino); 
    return p->fts_ino; 
} 

weitere Hinweise:

Q: Ist das ein Projekt? Willst du uns dazu bringen, deine Hausaufgaben zu machen? A: Ja, es ist ein Projekt für eine Klasse, aber offensichtlich habe ich bereits eine Antwort gefunden, mit der ich zufrieden bin und um Hilfe bzgl. Des Linkerfehlers bittet, ich bitte nicht um eine Lösung, beleidige mich nicht, dass ich das behaupte bin zu faul, um es zu lösen (nur für den Fall :))

Q: Warum in table.c? A: Wir müssen einen Patch mit Git machen, aber es ist bekannt, dass es etwas schwer ist, neue Dateien zu dem Patch hinzuzufügen, also bleibe ich bei table.c, das sowieso im Patch enthalten ist - was ich bin Sprichwort ist, ich weiß, dass ich generell neuen Code in separate Dateien schreiben sollte, aber angesichts der Tatsache, dass ich nicht viel mehr tun werde, ist es wirklich einfacher.

Frage: Habe ich mir Alternativen angesehen? A: Ich scheine die einzige zu sein, die sich an die FTS-Struktur wendet, ich würde es lieber wie erwartet arbeiten und eine einzigartige Lösung einreichen, als nur das zu tun, was alle anderen tun. Sobald die Anmutstage beginnen, werde ich es auch anders versuchen.

Frage: Haben Sie nachgeschlagen? A: Yup, es kam nur sehr wenig, was ich nicht sagen kann, war hilfreich.

Vielen Dank im Voraus für jeden Versuch zu helfen.

Antwort

0

Dies wird nicht funktionieren. VFS 's Aufgabe ist es, I/O-Anfragen auf den richtigen "Treiber" zu übertragen, der sie bedienen wird. open und read in Ihrem Code sind Möglichkeiten zum Ausführen solcher Anfragen. Aber VFS kann nur Anfragen von "Benutzer" -Programmen behandeln; es kann nicht call itself. ls.c als Quelle zu verwenden, um VFS zu ändern, war eine schlechte Idee.

Sie müssen die Anrufe zu open und read mit dem Effekt ersetzen, den sie innerhalb VFS haben, unter Verwendung eat_path und solcher.