dangerous fork !

System: Ubuntu

Compiler: gcc

使用fork创建一个子进程的时候,如果一不心可能出现很难找到的BUG,特别是子进程修改父进程的数据的时候.....

下面是一个例子,在父进程打开了一个文件,理论上的"子进程会把父进程的数据拷贝到自己的数据区"是正确的,但

open所打开的文件的数据在系统内存中,而不是在父进程的数据区中! 所以造成的后果就是子进程把文件内部指针位置

给修改了......


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

int fd;
int pid;
char buf[10];

void msg( const char * s )
{
    long pos = lseek( fd, 0L, 1 );
    
    if( 0L > pos )
        perror("lseek failed!\n");
        
    printf("%s...file cursor position is: %d\n", s, pos );
    
}

int main( int argc, char * argv[] )
{
    fd = fopen( "data", O_RDONLY );
    if( 0 > fd )
    {
        perror("open failed!\n");
        return 0;
    }
    
    msg("before fork");
    pid = fork();
    msg("after fork");
    
    if( -1 == pid )
    {
        perror("fork failed!\n");
    }
    else if( 0 == pid )
    {
        msg("child: before fseek");
        read( fd, buf, 10 );
        msg("child: after fseek");
    }
    else
    {
        msg("parent: before wait");
        wait(0);
        msg("parent: after wait!");
    }
 
    close( fd );
    return 0;
}
            
            
        
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值