2016-04-08 12 views
0

私はglibc-2.19のソースを読んでいます。私がfopenを使用してFILEのポインタを取得すると、stdioのバッファが既に存在していることがわかりました。いつ、どこで割り当てられ、初期化されましたか?glibc:いつ、どこでstdioストリームバッファが割り当てられ、初期化されますか?

+0

ここではわかりません いつ:OSがlibcの機能(特にstdio.hの機能)を初めて必要とするのですか? – Pierre

答えて

0

私は、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_ptrnextにウォッチポイントを設定してみましょう:

(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に割り当てるバッファを与えていない見ることができます。

関連する問題