当前位置: 技术问答>linux和unix
文件I/O和标准I/O,类似的程序,结果不同
来源: 互联网 发布时间:2016-09-11
本文导语: 在下面两个程序中,输出的文件中一个有三行输出,另一个却只有两行输出,不明白为什么?? #include #include int main() { int fd = 0, pid = 0; char msg1[] = "Test 1 2 3..n"; char msg2[] = "Hello, worldn"; if (-1 == (f...
在下面两个程序中,输出的文件中一个有三行输出,另一个却只有两行输出,不明白为什么??
#include
#include
int main()
{
int fd = 0,
pid = 0;
char msg1[] = "Test 1 2 3..n";
char msg2[] = "Hello, worldn";
if (-1 == (fd = creat("testfile1", 0644)))
return 0;
if (-1 == write(fd, msg1, strlen(msg1)))
return 0;
if (-1 == (pid = fork()))
return 0;
if (-1 == write(fd, msg2, strlen(msg2)))
return 0;
close(fd);
return 1;
}
#include
int main()
{
FILE *fp = NULL;
int pid = 0;
char msg1[] = "Test 1 2 3..n";
char msg2[] = "Hello, worldn";
if (NULL == (fp = fopen("testfile2", "w"))) {
return 0;
}
fprintf(fp, "%s", msg1);
if ((pid = fork()) == -1)
return 0;
fprintf(fp, "%s", msg2);
fclose(fp);
return 1;
}
|
第二个程序用的是系统函数库,函数库的I/O先保存在用户层的缓存中,最后一次写入。程序执行流程大体如下:
1、程序通过fprintf将数据写到进程用户的缓存中。
2、程序fork出两个进程,新产生的子进程将全部复制父进程中的数据空间、堆和栈(包括前面用fprintf写到用户缓存中的数据)。
3、其中一个进程再次调用fprintf将数据写到用户缓存中。
4、其中一个进程调用fclose将缓存中的数据写到文件中(第一、二行)
5、另一个进程再次调用fprintf将数据写到用户缓存中。
6、另一个进程调用fclose将缓存中的数据写到文件中(第三、四行)
1、程序通过fprintf将数据写到进程用户的缓存中。
2、程序fork出两个进程,新产生的子进程将全部复制父进程中的数据空间、堆和栈(包括前面用fprintf写到用户缓存中的数据)。
3、其中一个进程再次调用fprintf将数据写到用户缓存中。
4、其中一个进程调用fclose将缓存中的数据写到文件中(第一、二行)
5、另一个进程再次调用fprintf将数据写到用户缓存中。
6、另一个进程调用fclose将缓存中的数据写到文件中(第三、四行)