- 论坛徽章:
- 0
|
小弟最近正在学习Unix/Linux下的编程知识,以《Unix/Linux编程实践教程》为参考,在学习了fork函数后,做书后习题时遇到了下面的问题。
请先看两段短代码:
(1)
#include <stdio.h>
#include <string.h>
int main()
{
int fd;
int pid;
char msg1[] = "Test 1 2 3 ..";
char msg2[] = "Hello ,hello\n";
if((fd = creat("testfile",0644)) == -1)
{
return 0;
}
if(write(fd,msg1,strlen(msg1)) == -1)
{
return 0;
}
//begin to fork
if((pid = fork()) == -1)
{
return 0;
}
if(write(fd,msg2,strlen(msg2)) == -1)
{
return 0;
}
close(fd);
return 1;
}
(2)
#include <stdio.h>
#include <string.h>
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,"%d:%s",getpid(),msg1);
//begin to fork
if((pid = fork()) == -1)
{
return 0;
}
fprintf(fp,"%d:%s",getpid(),msg2);
fclose(fp);
return 1;
}
以上代码运行结果分别如下:
调用了write的程序结果是1个Test...2个Hello....
调用了fprintf/fwrite的程序结果是2个Test...2个Hello....
当然,一般情况下对fork的使用不这么用,但是,通过这两个例子,想请教以下几个问题:
1。当第一个例子fork出和原进程一样的子进程时,两个进程的具有相同的fd,而这两个进程同时也拥有一样的保存文件当前位置的指针,执行程序前我以为两个进程都向同一位置写入数据会导致一条的写入丢失,而事实上2条写入都生效。请问,这个保存文件位置的指针为两个进程所共享吗?它位于哪里呢?是存放于内核中吗?一个进程的写入会导致另一个进程看到文件指针的变化情况?
2。第二个例子出现了2个Test...2个Hello....,这个好像是缓冲的原因?fprintf/fwrite最终会调用write系统调用向磁盘写入数据?自己感觉fprintf/fwrite的实现中有缓冲机制,不知是否正确。如果有的话,这个缓冲区是依属于进程,所以fork后每个进程都有个自己的fprintf缓冲?
3。学习中发现write操作也并不是直接写入硬盘,也是写入一个所谓的内核缓冲区。当达到一定程度,该缓冲区数据被真正写入硬盘等外设。这个write写入的缓冲区与fprintf/fwrite的缓冲区(如果有)都位于系统的什么地方,有什么联系呢?
4。内核中有负责文件读写的驱动程序,而用户空间可能有很多进程涉及文件读写的操作,可能是都操作一个文件,也可能操作各自不同的文件。驱动程序与用户空间中的进程是什么关系呢?是一个用户空间的进程对应一个内核驱动程序的进程的副本,还是不管用户空间有多少涉及文件I/O的进程,而内核中只有一个运行着的驱动程序?如果这样,该驱动程序中是否存有保存各个进程的文件I/O信息的数据结构呢?这个问题始终不太明白。
谢谢大家的解答。 |
|