zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Nodejs怎样在服务端写定时脚本,自动备份MongoDB数据库,并记录日志
    nodejs-websocket初使用
    CSS3的复习笔记
    ES6的新增特性
    Windows下初体验MongoDB数据库
    Node.js数据库的配置,封装query
    Nuxt+Vuex初体验
    Vue+Vuex初体验
    github二级域名配置
    钉钉静默安装
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2745427.html
Copyright © 2011-2022 走看看