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;
}
            
            
        
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章