Linux에서의 파일 I/O 프로그래밍

WBOY
풀어 주다: 2024-03-30 21:31:11
앞으로
366명이 탐색했습니다.
(1).open()이 파일을 엽니다
으아악

매개변수 1: 경로 이름, 파일이 있는 경로
매개변수 2: 프로그램 프로세스와 관련된 플래그, 파일 권한
일반적인 매크로는 다음과 같습니다: O_WRONLY,O_RDONLY,O_RDWR,O_EXCL,O_APPEND,O_DUMP
매개변수 3: 모드, 파일을 생성할 때 사용되며 일반적으로 umask 값입니다.
반환 값: 파일 설명자를 성공적으로 반환하고, 그렇지 않으면 -1을 반환합니다.

(2) 닫기, 파일을 닫습니다. 매개변수는 파일 설명자입니다
으아악
(3) 파일에 데이터 쓰기, 쓰기
으아악

fd: 파일 설명자
buf: 쓸 데이터를 저장합니다
count: 쓰기 길이(바이트)
반환 값: 쓰기에 성공하면 쓴 문자 길이를 반환하고, 그렇지 않으면 -1을 반환한다.

(4) 파일의 데이터 읽기, 읽기
으아악

fd: 파일 설명자
buf: 읽을 데이터를 저장합니다
count: 읽은 길이(바이트)
반환 값: 읽기에 성공하면 읽은 문자 길이를 반환하고, 그렇지 않으면 -1을 반환합니다.
예:
#포함

(5)lseek, 파일 오프셋 수정
으아악

fd: 파일 설명자
offset: 오프셋할 바이트 수입니다.
whence: 그로부터의 오프셋, 매크로는 다음과 같이 정의됩니다:
SEEK_END 파일 끝
SEEK_CUR 현재 오프셋 위치
SEEK_SET 파일의 시작
참고: 오프셋이 파일 길이보다 크면 구멍이 생성됩니다. 구멍은 설정된 오프셋이 파일 끝을 초과하고 원본 파일 끝과 새 오프셋 위치 사이에 일부 데이터를 쓰기 때문에 발생합니다. .그것이 만들어진 구멍입니다. 구멍은 디스크 공간을 차지하지 않으며 사용할 수 있습니다:

으아악

예:

으아악
(6) 액세스는 파일이 읽기 가능, 쓰기 가능, 실행 가능하거나 존재하는지 여부를 결정합니다
으아악

경로명: 파일명
모드에서는 다음 매크로를 선택할 수 있습니다:
F_OK 파일이 존재하는가? R_OK 파일에 읽기 권한이 있습니까? X_OK 파일에 실행 권한이 있습니까
W_OK 파일에 쓰기 권한이 있나요
반환 값: 모드의 매개변수가 올바르게 충족되고 실행되면 0을 반환하고, 그렇지 않으면 -1을 반환합니다.

(7) dup 또는 dup2, 동일한 파일 테이블을 가리키는 파일 설명자를 만듭니다
으아악 oldfd: 원본 파일 설명자
newfd: 새 파일 설명자 값을 지정합니다. 설명이 이미 있으면 먼저 닫습니다. oldfd가 newfd와 같으면 ze는 설명을 닫지 않고 newfd를 반환합니다.

다음은 파일의 커널 구조에 대한 간략한 소개입니다: 먼저, 컴퓨터 시스템에는 프로세스 테이블이 있으며, 각 프로세스 테이블 항목에는 열린 파일 설명 테이블 항목이 많이 있습니다. , 각 항목에는 파일 설명자 플래그와 파일 포인터의 두 부분이 포함됩니다. 여기서 파일 포인터는 파일 테이블을 가리킵니다. 파일 테이블은 파일의 상태 플래그, 즉 읽기 가능 또는 쓰기 가능 여부와 오프셋을 저장합니다. v 노드 테이블을 가리키는 v 노드 포인터도 있습니다. v 노드 테이블은 주로 파일 소유자, 파일 길이, 파일 장치 및 위치와 같은 일련의 정보를 저장합니다. 디스크에 있는 파일의 실제 데이터 블록입니다. 어쩌면 이 설명이 명확하지 않을 수도 있으므로 그림을 사용하여 설명해 보겠습니다.


Linux에서의 파일 I/O 프로그래밍

(8) 동기화 및 fsync

(对于以下会主要是针对的内核缓冲)由于io操作会首先将数据放入内核缓冲区,所以在写的时候如果出现系统故障则缓冲区的数据可能会丢失,所以为了防止这种情况发生,以上两个函数使得内核缓冲区的数据立即写入磁盘。

#include
void sync(void);将所有缓冲排入写队列,然后立即返回
int fsync(int fd);将所有缓冲排入写队列,直到该缓冲去的数据写入磁盘后才返回。
int fdatasync(int fd);几乎和fsync函数相同,只是fdatasync(int fd)函数只影响数据部分,而fsync还会同步更新文件的属性。
로그인 후 복사
(九)fcntl函数,该函数可以改变已经发开文件的性质
#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缓冲的问题吧

linux中有两个级别的缓冲:IO缓冲与内核缓冲

(1)IO缓冲:对于标准IO操作,都会有一个缓冲区,当用户想要写数据时,首先将数据写入缓冲区,待缓冲区满之后才能调用系统函数写入内核缓冲区。当用户想读取数据时,首先向内核读取一定的数据放入IO缓冲区,读操作从缓冲区中读数据,当读完IO缓冲区的数据时,才能再读取数据到IO缓冲区。

目的:减少对磁盘的读写次数,提高工作效率。

(2)内核缓冲区:操作系统内核部分也有缓冲,其与IO缓冲区是不同的,其主要区别用一张图表示:

Linux에서의 파일 I/O 프로그래밍

 

위 내용은 Linux에서의 파일 I/O 프로그래밍의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:linuxprobe.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!