fork父子进程对打开文件的共享

父子进程是共享文件表(文件状态标志、当前文件偏移量和v节点指针)的,和相互独立进程不一样。

详细见Unix高级环境编程p175.

 

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

#include <fcntl.h>

#include <string.h>



int main(void)

{

    int fd = open("test.txt", O_RDWR | O_CREAT | O_TRUNC);

  

    char write_buff[256] = "children";

    int len = strlen(write_buff);



    if (fork() == 0)  //fork使父进程的所有文件描述符都被复制到子进程中。

    {

        if (write(fd, write_buff, len) < 0)

        {

            perror("cannot write");

        }

        close(fd);

        exit(1);

    }

    sleep(2); //使先执行子进程,再执行父进程。
    
//!!!为什么要lseek()?父子进程共享文件表!
//即执行完子进程后,文件偏移量已指向文件尾,因为父子进程文件偏移量相同,
//所以父进程也指向文件尾,要读文件,必须重新设置文件偏移量。

    lseek(fd, 0, SEEK_SET);  
    char read_buff[256];

    if (read(fd, read_buff,len) < 0) //虽然子进程关闭了描述符,但父进程仍可进程读写操作。

    {

        perror("cannot read");

    }

    read_buff[len] = '\0';

    printf("%s\n", read_buff);



    return 0;

}

你可能感兴趣的:(fork)