Ich lese die Quelle von glibc-2.19. Ich fand, dass, wenn ich verwende, um einen Zeiger von FILE
zu bekommen, der Puffer des stdio bereits existierte. Wann und wo wurde es zugeteilt und initialisiert?glibc: Wann und wo ist der Stdio-Stream-Puffer zugewiesen und initialisiert?
0
A
Antwort
0
Ich fand, dass, wenn ich fopen verwende, um einen Zeiger von FILE zu bekommen, der Puffer des stdio bereits existierte.
Es ist nicht klar, was genau Sie gefunden haben oder wie. Normalerweise ist der Puffer, den FILE
verwendet, nicht zugeordnet, bis Sie versuchen, etwas zu lesen oder zu schreiben, um die FILE
.
Beispiel:
#include <stdio.h>
int main()
{
FILE *fp = fopen("/etc/passwd", "r");
int c = fgetc(fp);
return 0;
}
gcc -g t.c && gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x400535: file t.c, line 5.
Starting program: /tmp/a.out
Temporary breakpoint 1, main() at t.c:5
5 FILE *fp = fopen("/etc/passwd", "r");
(gdb) n
6 int c = fgetc(fp);
(gdb) p *fp
$1 = {
_flags = -72539000,
_IO_read_ptr = 0x0,
_IO_read_end = 0x0,
_IO_read_base = 0x0,
_IO_write_base = 0x0,
_IO_write_ptr = 0x0,
_IO_write_end = 0x0,
_IO_buf_base = 0x0,
_IO_buf_end = 0x0,
_IO_save_base = 0x0,
_IO_backup_base = 0x0,
_IO_save_end = 0x0,
_markers = 0x0,
_chain = 0x7ffff7dd41c0 <_IO_2_1_stderr_>,
_fileno = 3,
_flags2 = 0,
_old_offset = 0,
_cur_column = 0,
_vtable_offset = 0 '\000',
_shortbuf = "",
_lock = 0x6020f0,
_offset = -1,
__pad1 = 0x0,
__pad2 = 0x602100,
__pad3 = 0x0,
__pad4 = 0x0,
__pad5 = 0,
_mode = 0,
_unused2 = '\000' <repeats 19 times>
}
Above man deutlich sehen, dass keine der internen Puffer: _IO_read_ptr
, _IO_read_end
usw. noch zugeteilt worden sind.
Lassen Sie sich nun einen Beobachtungspunkt auf &fp->_IO_read_ptr
und next
gesetzt:
(gdb) watch -l fp._IO_read_ptr
Hardware watchpoint 3: -location fp._IO_read_ptr
(gdb) next
Hardware watchpoint 3: -location fp._IO_read_ptr
Old value = 0x0
New value = 0x7ffff7ff7000 ""
0x00007ffff7a8f689 in _IO_new_file_underflow (fp=0x602010) at fileops.c:608
608 fileops.c: No such file or directory.
(gdb) bt
#0 0x00007ffff7a8f689 in _IO_new_file_underflow (fp=0x602010) at fileops.c:608
#1 0x00007ffff7a9062e in __GI__IO_default_uflow (fp=0x602010) at genops.c:435
#2 0x00007ffff7a86bae in _IO_getc (fp=0x602010) at getc.c:39
#3 0x00000000004005a4 in main() at t.c:6
Jetzt können Sie, die versuchen, sehen vom FILE
zu lesen verursacht zu den Puffern in _IO_new_file_underflow
zugeordnet werden.
Verwandte Themen
- 1. Administratorkonto: Wo, wann und wie?
- 2. Anonyme Klassen, wann und wo?
- 3. Wann und wo wird der String im Java-Quellcode initialisiert/gespeichert?
- 4. Wann werden die Instanzvariablen der Aktivität initialisiert?
- 5. Wann wird NavigationService initialisiert?
- 6. Wo wurde der Griff zugewiesen?
- 7. glibc und SSE Funktionalität
- 8. glibc, glib und gnulib
- 9. Wo und wann eine Datenbankverbindung zu öffnen
- 10. Finden, wann und wo Konflikt passierte
- 11. Wann wird HttpContext.User initialisiert?
- 12. Wann werden Paketobjekte initialisiert?
- 13. Intelligente Zeiger. Wann, wo und wie?
- 14. Wann und wo zu implementieren ACL
- 15. Wo ist der Speicher für einen lokalen C++ - Vektor zugewiesen?
- 16. Fancybox Beispiele: Wo ist Fancybox initialisiert?
- 17. Woher weiß ich, wann Polymer Dart vollständig initialisiert ist?
- 18. Wann wird die Stufe initialisiert?
- 19. Wo wird der ViewGroup-Container initialisiert?
- 20. Wann werden Lambda-Captures initialisiert?
- 21. Linq - Wo(). Wo() ist UND oder ODER?
- 22. Wann ist der Unterschied zwischen quotRem und divMod nützlich?
- 23. Hibernate- und JPA-Kaskadentypen, wann welcher und wo zu verwenden ist
- 24. Statisch mit glibc und libstdC++ verbinden
- 25. Wann verlinken und wann einbeziehen?
- 26. C++, wo static const initialisiert
- 27. Wann sollte ENOMEM errno zugewiesen werden?
- 28. Wann/proc und wann/dev
- 29. Wann ist die Session-Eigenschaft im Controller initialisiert?
- 30. Wann undef_method und wann remove_method?
Wo: weiß nicht Wann: das erste Mal, dass libc Funktionen (insbesondere die in stdio.h) vom Betriebssystem benötigt werden? – Pierre