파일 I 제 7 장 / O (4)

파일 공유

파일 커널 데이터 구조를 엽니 다

프로세스는 두 번 같은 파일을 엽니 다

프로세스 1024 파일 기술자를 열 수있는 파일이 열려 있지, 파일 테이블, 노드 테이블 V에 파일 포인터 테이블 V 노드 지점을 생성합니다 커널은, V는 정보 통계 함수가 반환의 일부 노드 정보는 내가 때 노드 정보입니다 우리는 파일 열기, 파일 시스템이 노드 V의 i 노드 정보에 대응하는 I-노드 정보를 복사한다 (i- 노드 번호, 파일이 존재하는지)

 

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>

#define ERR_EXIT(m) \
        do  \
        {   \
            perror(m); \
            exit(EXIT_FAILURE); \
        }while(0)

int main(int argc, char* argv[])
{
    int fd1,fd2;
    char readbuf1[1024] = {0};
    char readbuf2[1024] = {0};

    //open会打开文件表,文件表会记录当前文件的状态标志,当前文件的偏移量,引用计数,v节点指针,
    //每个fd都是独立的,所以偏移量这些也是唯一的,不会影响其他fd的偏移量
    fd1 = open("test.txt",O_RDONLY);
    if(fd1 == -1)
        ERR_EXIT("open");
    read(fd1, readbuf1, 4);
    printf("readbuf1 = %s\n",readbuf1);
    
    //open会新开文件表
    fd2 = open("test.txt",O_RDWR);
    if(fd2 == -1)
        ERR_EXIT("open");
    read(fd2, readbuf2, 4);
    printf("readbuf2 = %s\n",readbuf2);
    //写入数据后,v节点中的i节点对应硬盘中的数据改变了
    write(fd2,"AAAAA",6);


    memset(readbuf1, 0, sizeof(readbuf1));
    read(fd1, readbuf1, 6);
    printf("readbuf1 = %s\n",readbuf1);


    close(fd1);
    close(fd2);

    return 0;
}

 

두 개의 프로세스가 동일한 파일을 엽니 다

파일 설명 복사 (DUP, dup2에, fcntl을)

기능 :
새로운 파일 기술자로 사용할 수있는 가장 작은 파일 기술자를 사용 newfd를의 복사본을 생성합니다.

int dup(int oldfd);
参数:
    oldfd : 文件描述符
返回值:
   成功:返回新的文件描述符
   出错:返回-1.注意:由dup函数返回的新文件描述符一定是当前可用文件描述符中的最小值。

출력 재 지정

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>

#define ERR_EXIT(m) \
        do  \
        {   \
            perror(m); \
            exit(EXIT_FAILURE); \
        }while(0)

int main(int argc, char* argv[])
{
    int fd1;
    fd1 = open("test2.txt", O_WRONLY);
    if(fd1 == -1)
        ERR_EXIT("open");

    close(1);
    dup(fd1);
    printf("hello\n");

    //等同于上面的代码
    //dup2(fd1,1);

    close(fd1);

    return 0;
}

dup2에

기능 :
매개 변수에 대한 dup2에 중복 파일 설명은 언급 oldfd에, 복사는 매개 변수를 함께 newfd를 oldfd에 돌아갑니다. 새로운 설명 파일의 필수 사용에 관계없이 원본 파일 기술자의 무료 복사하기

  • 열린 파일 기술자로 newfd 매개 변수가 파일이 처음으로 폐쇄 newfd 언급 할 경우,
  • 종료하지 않고 동일한 newfd를, newfd 수익을, newfd 경우 문서가 newfd를 언급했다.
  • 복사 된 파일 기술자 dup2는 파일 기술자의 원래 상태로 다양한 문서를 공유 할 수 있습니다. 그래서 모든 잠겨, 읽기 - 쓰기 위치와 권한 또는 플래그 등을 공유 할 수 있습니다.
int dup2(int oldfd, int newfd);
参数:
    oldfd : 文件描述符
    newfd : 文件描述符
返回值:
    成功: 返回新的文件描述符
    出错: 返回-1. 注意:由dup2函数返回的新文件描述符一定是当前可用文件描述符中的最小值。

 
newfd 및 newfd를 공통점은 :
(1) 동일한 파일 열기 (관).
(2) 동일한 파일 포인터, 즉 두 개의 파일은 파일 포인터를 공유 할 수 있습니다.
(3) 동일한 액세스 모드. 쓰기, 읽기.
(4) 동일한 파일 식별자의 상태.

추천

출처www.cnblogs.com/s3320/p/11329390.html