fork()、文件和数据

  用系统 fork() 建立的子进程几乎与其父进程完全一样。子进程中的所有变量均保持 它 
们在父进程中之值( fork()的返回值除外)。因为子进程可用的数据是父进程可用数据的拷
贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,
不能影响到其它进程中的变量。这一点非常重要。
  另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文
件描述符。但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,
这是以为子进程与父进程公用这些文件的文件指针。这就有可能发生下列情况:由于文件
指针由系统保存,所以程序中没有保存它的值,从而当子进程移动文件指针时,也等于移
动了父进程的文件指针。这就可能会产生意想不到到结果。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

void failure(char *s)
{
        perror(s);
        exit(1);
}

void printfpos(char * string ,int files)
{
        long pos;
        if((pos=lseek(files,0L,1))<0L)
                failure("lseek error!!");
        printf("%s:%d\n",string,pos);
}

void main()
{
        int fd;
        int pid;
        int buff[20];
        if((fd=open("data",O_RDONLY))<0)
                failure("open error!!");
        read(fd,buff,10);
        printfpos("Fork Before",fd);
        if((pid=fork())<0)
        {
                failure("fork error!!");
        }
        else if(!pid)
        {
                printfpos("child fd before:",fd);
                read(fd,buff,10);
                printfpos("child fd after",fd);
        }
        else
        {
                wait(NULL);
                printfpos("father fd",fd);
        }
}

 

运行结果:

  Fork Before:10
  child fd before::10
  child fd after:20
  father fd:20

这充分说明了文件指针为两个进程共用这一事实。

转载于:https://www.cnblogs.com/pobizr/p/8630287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值