confusion on fopen()/falloc()
John-Mark Gurney
gurney_j at resnet.uoregon.edu
Sat Feb 26 09:47:22 GMT 2005
Yan Yu wrote this message on Sat, Feb 26, 2005 at 01:10 -0800:
> Hello, all,
> I have a user program as below:
> FILE *fd;
> while (1)
> {
> fd= fopen( "tmp", "r" );
> if ( fd == NULL )
> break;
> }
>
> from my understanding, since i open the same file to read, my process
> should create a new file descriptor each time when fopen is called.
> Therefore, inside the kernel, fdalloc() should be called, NOT falloc()
> (since falloc() allocates a new FILE * struct in addition to a new file
> descriptor),
> BUT based on what i observed (i instrumented falloc() function), it seems
> that falloc() is called each time when fopen() is called.
> I am wondering where i missed?
first off, if you are looking at this code, you probably want to be
calling open instead of fopen... fopen is stdio and is implemented in
src/lib/libc/stdio/fopen.c... There it'll do an open system call, but
you don't have as direct control over it... Also, the kernel is not
responsible for FILE * allocations, that is purely a userland
implementation detail.. it will end up getting mapped to a file
descriptor opened via open...
if you look in src/sys/kern/vfs_syscalls.c at open, it calls kern_open
(in the same file) which calls falloc... falloc by it's comment does
more than just allocate a file descriptor, it also allocates a new file
structure, but then it does call fdalloc to get the file descriptor..
Again, make sure you don't confuse the userland FILE * with the kernel..
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
More information about the freebsd-hackers
mailing list