免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2142 | 回复: 0
打印 上一主题 下一主题

请教fork下的read/write、fread/fwrite的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-08 10:58 |只看该作者 |倒序浏览
大家好:
    小弟最近正在学习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。内核中负责文件读写的驱动程序与用户空间中的进程是什么关系呢?是一个用户空间的进程对应一个内核驱动程序的进程,还是只有一个运行的驱动程序而在其中存有保存各个连接文件进程的信息的数据结构表呢?这个问题始终不太明白。
谢谢大家的解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP