0
私はglibc-2.19のソースを読んでいます。私がfopen
を使用してFILE
のポインタを取得すると、stdioのバッファが既に存在していることがわかりました。いつ、どこで割り当てられ、初期化されましたか?glibc:いつ、どこでstdioストリームバッファが割り当てられ、初期化されますか?
私はglibc-2.19のソースを読んでいます。私がfopen
を使用してFILE
のポインタを取得すると、stdioのバッファが既に存在していることがわかりました。いつ、どこで割り当てられ、初期化されましたか?glibc:いつ、どこでstdioストリームバッファが割り当てられ、初期化されますか?
私は、FILEのポインタを得るためにfopenを使用すると、stdioのバッファがすでに存在していることがわかりました。
あなたが見つけたもの、またはその方法がはっきりしません。通常FILE
が使用するバッファは、FILE
に何かを読み書きしようとするまで、ではなく、です。
例:
#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>
}
あなたが内部バッファのどれことをはっきり見ることができます上:_IO_read_ptr
、_IO_read_end
などがまだ割り当てられていないされています。
今度は&fp->_IO_read_ptr
とnext
にウォッチポイントを設定してみましょう:
(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
今、あなたはFILE
から読み取るために、その試みが_IO_new_file_underflow
に割り当てるバッファを与えていない見ることができます。
ここではわかりません いつ:OSがlibcの機能(特にstdio.hの機能)を初めて必要とするのですか? – Pierre