您的位置:首页 > 运维架构 > Linux

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

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

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

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的内容相同
以上代码结果是:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux