Chinaunix

标题: 请教fork下的read/write、fread/fwrite的问题 [打印本页]

作者: dwlnet    时间: 2008-01-08 10:58
标题: 请教fork下的read/write、fread/fwrite的问题
大家好:
    小弟最近正在学习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的实现中有缓冲机制,是吗?这个缓冲区是每个进程所有?
3。网上查资料发现write写入数据时并不是直接写入硬盘,也是写入内核缓冲区。这个缓冲区与fprintf/fwrite的缓冲区有什么关系呢?
这两个例子弄得我有点晕,呵呵。
4。内核中负责文件读写的驱动程序与用户空间中的进程是什么关系呢?是一个用户空间的进程对应一个内核驱动程序的进程,还是只有一个运行的驱动程序而在其中存有保存各个连接文件进程的信息的数据结构表呢?这个问题始终不太明白。
谢谢大家的解答。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2