매개변수 1: 경로 이름, 파일이 있는 경로
매개변수 2: 프로그램 프로세스와 관련된 플래그, 파일 권한
일반적인 매크로는 다음과 같습니다: O_WRONLY,O_RDONLY,O_RDWR,O_EXCL,O_APPEND,O_DUMP
매개변수 3: 모드, 파일을 생성할 때 사용되며 일반적으로 umask 값입니다.
반환 값: 파일 설명자를 성공적으로 반환하고, 그렇지 않으면 -1을 반환합니다.
fd: 파일 설명자
buf: 쓸 데이터를 저장합니다
count: 쓰기 길이(바이트)
반환 값: 쓰기에 성공하면 쓴 문자 길이를 반환하고, 그렇지 않으면 -1을 반환한다.
fd: 파일 설명자
buf: 읽을 데이터를 저장합니다
count: 읽은 길이(바이트)
반환 값: 읽기에 성공하면 읽은 문자 길이를 반환하고, 그렇지 않으면 -1을 반환합니다.
예:
#포함
fd: 파일 설명자
offset: 오프셋할 바이트 수입니다.
whence: 그로부터의 오프셋, 매크로는 다음과 같이 정의됩니다:
SEEK_END 파일 끝
SEEK_CUR 현재 오프셋 위치
SEEK_SET 파일의 시작
참고: 오프셋이 파일 길이보다 크면 구멍이 생성됩니다. 구멍은 설정된 오프셋이 파일 끝을 초과하고 원본 파일 끝과 새 오프셋 위치 사이에 일부 데이터를 쓰기 때문에 발생합니다. .그것이 만들어진 구멍입니다. 구멍은 디스크 공간을 차지하지 않으며 사용할 수 있습니다:
예:
으아악경로명: 파일명
모드에서는 다음 매크로를 선택할 수 있습니다:
F_OK 파일이 존재하는가?
R_OK 파일에 읽기 권한이 있습니까?
X_OK 파일에 실행 권한이 있습니까
W_OK 파일에 쓰기 권한이 있나요
반환 값: 모드의 매개변수가 올바르게 충족되고 실행되면 0을 반환하고, 그렇지 않으면 -1을 반환합니다.
다음은 파일의 커널 구조에 대한 간략한 소개입니다: 먼저, 컴퓨터 시스템에는 프로세스 테이블이 있으며, 각 프로세스 테이블 항목에는 열린 파일 설명 테이블 항목이 많이 있습니다. , 각 항목에는 파일 설명자 플래그와 파일 포인터의 두 부분이 포함됩니다. 여기서 파일 포인터는 파일 테이블을 가리킵니다. 파일 테이블은 파일의 상태 플래그, 즉 읽기 가능 또는 쓰기 가능 여부와 오프셋을 저장합니다. v 노드 테이블을 가리키는 v 노드 포인터도 있습니다. v 노드 테이블은 주로 파일 소유자, 파일 길이, 파일 장치 및 위치와 같은 일련의 정보를 저장합니다. 디스크에 있는 파일의 실제 데이터 블록입니다. 어쩌면 이 설명이 명확하지 않을 수도 있으므로 그림을 사용하여 설명해 보겠습니다.
(对于以下会主要是针对的内核缓冲)由于io操作会首先将数据放入内核缓冲区,所以在写的时候如果出现系统故障则缓冲区的数据可能会丢失,所以为了防止这种情况发生,以上两个函数使得内核缓冲区的数据立即写入磁盘。
#include void sync(void);将所有缓冲排入写队列,然后立即返回 int fsync(int fd);将所有缓冲排入写队列,直到该缓冲去的数据写入磁盘后才返回。 int fdatasync(int fd);几乎和fsync函数相同,只是fdatasync(int fd)函数只影响数据部分,而fsync还会同步更新文件的属性。
#include #include int fcntl(int fd, int cmd, ... /* arg */ );
fd:文件描述符
cmd 指明该函数执行什么功能
F_DUPFD 赋值文件描述符,功能相当于dup和dup2函数。例如:
dup(fd)等价于
fcntl(fd,F_DUPFD,0)
dup2(oldfd,newfd)等价于
close(newfd);
fcntl(oldfd,F_DUPFD,newfd);
F_GETFD 的到文件描述符标志,当前之定义一个文件描述符标志,FD_CLOSEEXEC.此时第三个参数被忽视。
F_SETFD 设置文件描述符标志,设置的值是函数的第三个参数,其一般可设置为0表示关闭,1表示打开。
F_SETFL 设置文件状态标志,其值放在函数的第三个参数,和open函数第二个参数的值一样的。
F_GETFL 得到文件状态标志。此时第三个参数被忽视。
arg 可选参数,根据第二个参数填写。
返回值:出错返回-1,否则哈返达到的标志。
例如:
#include #include #include #include int main(int argc,char * argv[]) { int fd; int val=3; if( (fd = open(argv[1],O_RDWR|O_APPEND)) == -1 )//测试一下是否可以同时检测出文件的读写属性 { exit(2); } if( val = fcntl(fd,F_GETFL,0) == -1 ) { exit(1); } printf("%d\n",val); printf("%d %d %d\n",O_RDONLY,O_WRONLY,O_RDWR); int n = val & O_ACCMODE; if( n == O_RDONLY) printf("read\n"); if(O_WRONLY & val ) printf("write\n"); if( n == O_RDWR) printf("read and write\n"); }
linux中有两个级别的缓冲:IO缓冲与内核缓冲
(1)IO缓冲:对于标准IO操作,都会有一个缓冲区,当用户想要写数据时,首先将数据写入缓冲区,待缓冲区满之后才能调用系统函数写入内核缓冲区。当用户想读取数据时,首先向内核读取一定的数据放入IO缓冲区,读操作从缓冲区中读数据,当读完IO缓冲区的数据时,才能再读取数据到IO缓冲区。
目的:减少对磁盘的读写次数,提高工作效率。
(2)内核缓冲区:操作系统内核部分也有缓冲,其与IO缓冲区是不同的,其主要区别用一张图表示:
위 내용은 Linux에서의 파일 I/O 프로그래밍의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!