fork()、文件和数据

系统 fork()建立的子进程几乎与其父进程完全一样。子进程中的所有变量均保持它们在父进程中之值(fork()的返回值除外)。因为子进程可用的数据是父进程可用数据的拷贝,并且其占用不同的内存地址空间,所以必须要确保以后一个进程中变量数据的变化,不能影响到其它进程中的变量。

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

void printpos(char* string, int fields)
{
        long pos;
        pos = lseek(fields,0L,1);
        if(pos < 0L) failure("lseek failed");
        printf("%s %ld \n",string,pos);
}

int main(void)
{
        int fd;
        int pid;
        char buf[10];

        fd = open("data",O_RDONLY);
        if(fd < 0) failure("open file fail");
        read(fd,buf,10);
        printpos("before fork",fd);

        pid = fork();

        if(pid < 0) failure("fork failed");
        if(!pid){
                printpos("child before read",fd);
                read(fd,buf,10);
                printpos("child after read",fd);
        } else {
                wait(NULL);
                printpos("parent after wait",fd);
        }

        return 0;
}

 

另外,在父进程中已打开的文件,在子进程中也已被打开,子进程支持这些文件的文件描述符。但是,通过 fork()调用后,被打开的文件与父进程和子进程存在着密切的联系,这是以为子进程与父进程公用这些文件的文件指针。