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;
    }
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2745427.html
Copyright © 2011-2022 走看看