关于open函数的内部问题
在Linux下(注意不是windows) 调用open会在内核中建立一个file结构,当然在task_struct(及PCB中)结构中,由一个file指针指向它,所有open是把内核中的文件file结构映射到用户空间中,用户空间就用文件描述符操作文件,但是当2个或者更多进程打开同一个文件或者在同一进程中重复打开一个文件,虽然也返回不同的文件描述符,但是文件描述符都是指向同一个file结构,唯一有变化的就是在file结构体中有个count(好象是,具体名字记不清除了)的字段会增加,以表示有多少进程在使用本文件;简单的说,如果用open以同一中方式打开同一个文件,在内核中都使用同一个file结构可以参看以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <assert.h>
int main( void )
{
int fd1, fd2;
char str[10];
fd1 = open( "test", O_CREAT | O_RDWR );//这里O_CREAT不是打开方式,只是告诉内核如果test不存在就建立,如果存在就忽略
assert( fd1 != -1 );
printf( "file Number is: %d\n", fd1 );
fd2 = open( "test", O_RDWR );
assert( fd2 != -1 );
printf( "file Number is: %d\n", fd2 );//这里验证返回了不一样的文件描述符
write( fd2, "Hello", 5 );
write( fd2, "pig", 3 );//这里我们用fd2写文件
read( fd1, str , 8 ); //这里我们用fd1读文件
str[9] = '\n';
printf( "read file is :%s\n", str ); //这里输出的是Hellopig,可以验证虽然是2个不同的文件描述符,但是是使用的同一个file结构
return 0;
}
以上代码是验证一个进程里2个不同open调用使用一个file结构程序
以下代码是不同2个进程打开同一个文件的实验
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <assert.h>
int main( void )
{
int fd1;
fd1 = open( "test", O_CREAT | O_RDWR );
assert( fd1 != -1 );
write( fd1, "Hello,Pig", 9 );
sleep( 20 );//这里睡秒20秒,主要是为了打开另外一个进程
close( fd1 );
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <assert.h>
int main( void )
{
int fd1;
char str[10];
fd1 = open( "test", O_CREAT | O_RDWR );
assert( fd1 != -1 );
read( fd1, str, 9 );
str[9] = '\n';
printf( "%s\n", str );
close( fd1 );
return 0;
}
得出的结果是Hello,pig, 至此,完全证明了在用open打开文件时,如果打开文件的模式相同,则所有的文件描述符都是使用同一file的,所以像什么read,write之类的函数是线程不安全的 因为不可以重入
另外,说点题外话,起始我们用write时,操作的是file结构提供的内核缓冲区,不要以为在用户空间哟~~~~~~~~~
强列要求斑竹给弄成精华帖 我还没有一篇贴是精华帖(虽然我一共才发2篇帖)