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.
Wo: weiß nicht Wann: das erste Mal, dass libc Funktionen (insbesondere die in stdio.h) vom Betriebssystem benötigt werden? – Pierre