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