Linux进程-fork创建新进程之文件分析

探讨UNIX环境下父子进程同时打开同一文件时的操作交互及影响,通过代码实例展示并发文件操作对内核状态的依赖性。

写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!

如果发现一些笔记的说法完全是错误的请建议我删除!


UNIX环境高级编程一书中说通过一个IO函数可以返回一个文件设备符(fd),用户程序通过文件设备符(fd)与实际文件进行交互,实际上用户程序是通过内核与实际文件进行交互的,而这个实际文件在内核中标号为fd。


问题:

当两个进程(这里特指父子进程)同时打开同一个文件时,其中一个进程对这个文件的操作是否会影响到另一个进程?

回答:

由于用户程序是通过内核与实际文件打交道的,对于内核来说实际文件只有一个,当其中一个进程通过内核操作文件的时候该文件的一些属性就被改变了,当另一个程序通过内核访问实际文件的时候实际上是在文件被更新的状态下开始的,这样的一些操作的结果可能不是程序员所想要的既定结果。


以下代码来说明以上问题:

<div> #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>

int main()
{
    int fd = open("test.txt",O_CREAT|O_RDWR);
    char buf[256];
    if(fork())
    {
        printf("%d\n",fd);
        sleep(2);
        read(fd,buf,6);
        buf[6] = '\0';
        printf("parent:%s\n",buf);
        close(fd);
    }
    else
    {
        printf("%d\n",fd);
        read(fd,buf,6);
        buf[6] = '\0';
        printf("child:%s\n",buf);
        close(fd);
    }
    return 0;
} </div>

test.txt中的内容是:


结果是:



将如下代码的结果与上面的结果相比,思考一些问题

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>

int main()
{
    char buf[256];
    if(fork())
    {
        int fd = open("test.txt",O_CREAT|O_RDWR);
        printf("%d\n",fd);
        sleep(2);
        read(fd,buf,6);
        buf[6] = '\0';
        printf("parent:%s\n",buf);
        close(fd);
    }
    else
    {
        int fd = open("test.txt",O_CREAT|O_RDWR);
        printf("%d\n",fd);
        read(fd,buf,6);
        buf[6] = '\0';
        printf("child:%s\n",buf);
        close(fd);
    }

    return 0;
}
以上代码中test.txt的内容相同

以上代码结果是:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值