Ich versuche, meine eigene Implementierung der close()
Funktion in Linux bereitzustellen. Warum? Weil ich gerade herausgefunden habe, dass du das kannst und es hört sich lustig an.Ersetzen Sie die Close() -Funktion in Linux mit meiner eigenen close() -Funktion
Hier myclose.c:
#include <stdio.h>
int close(int fd) {
printf("Closing fd: %d\n", fd);
return 0;
}
Hier ist mein Make-Datei:
all: myclose.so my-close.so
%.so: %.o
gcc -shared -o [email protected] $<
%.o:%.c
gcc -c -fPIC -o [email protected] $<
clean:
rm -f *.so *.o
Nach dem Übersetzen, ich laufe:
export LD_PRELOAD=`pwd`/myclose.so
Dann laufe ich:
cat myclose.c
Der Ausgang ich erhalte, ist:
#include <stdio.h>
int close(int fd) {
printf("Closing fd: %d\n", fd);
return 0;
}
Closing fd: 3
Yay! Funktioniert richtig? Fast. cat
Aufrufe close()
mehr als einmal, aber wir sehen nur eine Zeile der Ausgabe. Nach strace
(und gesunden Menschenverstand) sollte close()
auch für Dateideskriptoren 1 und 2 aufgerufen werden. Wenn ich cat *
ausführen und alle Dateien im Verzeichnis cat, sehe ich "Closing fd: 3", "Closing fd: 4" usw. bis zur letzten Datei im Verzeichnis. Da alle diese Dateideskriptoren größer als 2 sind, dachte ich, dass es vielleicht ein Problem beim Schließen der speziellen Dateideskriptoren (stdout und stderr) gab. Wenn ich jedoch ls
ausführen sehe ich nur die reguläre Ausgabe und keine "Closing fd:" Zeilen, was bedeutet, dass es nicht für ls
entweder funktioniert, obwohl strace
10 zeigt, wenn ls
ausgeführt wird.
Irgendwelche Ideen, was könnte falsch sein?
Ich könnte hier völlig falsch sein, aber ist nicht die Shell kümmert sich FD 1 und 2? Hast du versucht, eine Shell zu starten, die es mit deinem "close()" vorlädt? – lorenzog