当前位置: 技术问答>linux和unix
fork() 函数如果用文件描述符和文件指针得到的不同结果!
来源: 互联网 发布时间:2016-04-08
本文导语: 文件描述符大开 #include #include int main() { int fd; int pid; char msg1[] = "Test 1 2 3 .. n" ; char ...
文件描述符大开
结果
Test 1 2 3 ..
Hello.hello
Hello.hello
文件指针打开
结果
Test 1 2 3 ..
Hello.hello
Test 1 2 3 ..
Hello.hello
为什么会有这样的不同?
#include
#include
int main()
{
int fd;
int pid;
char msg1[] = "Test 1 2 3 .. n" ;
char msg2[] = "Hello.hello n " ;
if (( fd = creat ("testfile" , 0644 )) == -1 )
return 0 ;
if ( write ( fd , msg1 , strlen(msg1) ) ==-1 )
return 0 ;
if ( ( pid = fork () ) == -1 )
return 0 ;
if ( write ( fd ,msg2 , strlen (msg2) ) == -1 )
return 0 ;
close ( fd ) ;
return 1 ;
}
结果
Test 1 2 3 ..
Hello.hello
Hello.hello
文件指针打开
#include
#include
int main()
{
FILE *fp;
int pid;
char msg1[] = "Test 1 2 3 .. n" ;
char msg2[] = "Hello.hello n " ;
if (( fp = fopen ("testfile2" , "w" )) == NULL )
return 0 ;
fprintf(fp,"%s",msg1 );
if ( ( pid = fork () ) == -1 )
return 0 ;
fprintf(fp,"%s",msg2 );
fclose ( fp ) ;
return 1 ;
}
结果
Test 1 2 3 ..
Hello.hello
Test 1 2 3 ..
Hello.hello
为什么会有这样的不同?
|
系统调用写文件:用户空间无缓存管理,调用write后逻辑上可以认为msg1已经写入文件(虽然还有page cache和disk cache),fork后,父子进程只各输出msg2
标准IO库函数写文件:默认为全缓存,调用fprintf后msg1只是输出到FILE*管理的用户缓存区里,fork后,子进程copy了父进程的很多数据包括刚才的缓存区中的msg1,所以最终父子进程各输出一个msg1
总之,问题的关键在于是否缓存输出数据
标准IO库函数写文件:默认为全缓存,调用fprintf后msg1只是输出到FILE*管理的用户缓存区里,fork后,子进程copy了父进程的很多数据包括刚才的缓存区中的msg1,所以最终父子进程各输出一个msg1
总之,问题的关键在于是否缓存输出数据