Linux 운영 체제는 모든 것이 파일이라는 개념을 고수합니다. 거의 모든 파일 장치는 일련의 시스템 호출, 즉 open()/close()/write()/read() 등으로 작동할 수 있습니다. 시스템 호출은 운영 파일의 C 라이브러리 호출과 유사합니다. Linux와 함께 제공되는 매뉴얼이 가장 권위 있는 매뉴얼입니다. 매뉴얼을 확인하여 시스템 호출 사용법을 확인하십시오.
코드명—— 의미
1 —— 쉘 환경에서 사용자가 조작/실행할 수 있는 명령
2 —— 커널
3 —— 일반적으로 사용되는 일부 함수 및 함수 라이브러리, 대부분의 C 함수 라이브러리
4 —— 장치 파일에 대한 설명, 일반적으로 /dev 아래의 장치
5 —— 구성 파일 또는 특정 파일의 형식
6 —— 게임
7 —— Linux 파일 시스템, 네트워크 프로토콜 등의 관리 및 프로토콜
8 &mdash ;— 시스템 관리자가 사용할 수 있는 명령
9 —— 커널 관련 파일
시스템 헤더 파일은 일반적으로 Linux 디렉토리의 /usr/include
에 저장됩니다. 아래에 포함된 헤더 파일 중 일부에는 실제로 include/usr/include
目录下;下面包含的一些头文件有的带了sys,其实是include底下的子目录中的头文件
返回值类型: int——文件描述符fd,每打开一个文件,就会得到一个文件描述符,这个文件描述符是整形的,我们通过文件描述符进行读写操作。
失败:-1
成功:>= 0,即文件描述符;
mode_t是一个类型别名,实际上就是一个有符号的整数,对open函数而言,仅仅当创建新文件时才使用第三个参数
flag:打开标志
注意: 这些其实都是定义的一些宏,当需要使用到多个参数时,使用按位或“ |
”构成多个flag参数
也可跟随下面的方式一起使用:
其他不一一介绍,需要使用时自查。
返回值:
若成功为已经写入的字节数;
若出错为-1;
注意:计划写入的字节数和函数的返回值不相等时,表示写入出现了错误,可以用来检验写入是否成功;
参数:
fd
:写入文件的文件描述符;
buf
:存放待写数据的缓存;
count
:要求写入一次数据的字节数;
注意:
对于普通文件,写操作从文件的当前位移量处开始,若如果在打开该文件时,指定了O_APPEND选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。
返回值 :读到的字节数
若已到文件尾为0;若出错为-1;
参数
fd
:读取文件的文件描述符;
buf
:存放读取数据的缓存;
count
반환 값 유형: int——파일 설명자 fd, 파일을 열 때마다 , 파일 설명자를 얻게 됩니다. 이 파일 설명자는 정수입니다. 파일 설명자를 통해 읽기 및 쓰기 작업을 수행합니다.
Failure: -1🎜Success: >= 0, 이는 파일 설명자입니다. 🎜🎜🎜🎜mode_t는 실제로 부호 있는 정수인 유형 별칭입니다. 세 번째 매개변수는 새 파일을 생성할 때만 사용됩니다🎜🎜🎜🎜flag: open flag🎜🎜🎜🎜🎜참고: 🎜 이는 실제로 정의된 일부 매크로입니다. 여러 매개변수를 사용해야 하는 경우 비트 OR "|
를 사용하세요. "다중 플래그 매개변수 구성🎜🎜은 다음과 같은 방법으로도 사용할 수 있습니다: 🎜🎜🎜🎜🎜🎜🎜🎜그 외의 내용은 하나씩 소개하지 않으니, 필요할 때 직접 확인하시기 바랍니다. 🎜🎜write()🎜🎜 🎜🎜🎜반환 값🎜: 🎜🎜🎜🎜성공한 경우 기록된 바이트 수입니다. 🎜🎜🎜🎜오류가 있는 경우 -1입니다. 참고: 계획된 바이트 수입니다. 함수의 반환 값과 같지 않으면 쓰기에 오류가 있다는 의미이며 쓰기 성공 여부를 확인하는 데 사용할 수 있습니다. 🎜🎜🎜🎜fd: 작성된 파일의 파일 설명자 🎜🎜🎜 🎜<code>buf
: 작성할 데이터를 저장하기 위한 캐시 🎜🎜🎜🎜count
: 필요한 바이트 수 🎜🎜🎜🎜🎜참고: 🎜🎜🎜 일반 파일의 경우 파일을 열 때 O_APPEND 옵션을 지정하면 파일 오프셋이 현재 오프셋으로 설정됩니다. 각 쓰기 작업 전 파일의 끝입니다. 쓰기가 성공한 후 파일 오프셋은 실제로 쓰여진 바이트 수만큼 증가합니다. 🎜🎜read()🎜🎜 🎜🎜🎜반환 값🎜: 읽은 바이트 수 🎜🎜🎜🎜파일 끝에 도달하면 0이고, 오류가 발생하면 -1입니다. 🎜🎜fd
: 파일 읽기를 위한 파일 설명자 🎜🎜🎜🎜buf
: 읽은 데이터를 저장하기 위한 캐시 🎜🎜🎜🎜count
: 바이트 데이터를 한 번 읽어야 합니다. 반환 값은 읽은 실제 바이트 수이며 동일하지 않습니다. 🎜🎜🎜🎜🎜참고: 🎜읽기 작업은 파일의 🎜현재 변위🎜에서 시작됩니다. 성공적으로 반환되기 전에 변위는 실제 읽은 바이트 수만큼 증가합니다(이 변위는 직접 설정할 수 있음).참고: 프로세스가 종료되면 프로세스가 열었던 모든 파일이 커널에 의해 자동으로 닫힙니다.
참고: 이러한 캐싱 없는 함수는 모두 커널에서 제공하는 시스템 호출입니다. 이는 표준 C의 일부가 아니라 POSIX의 구성 요소입니다. .
표준 C는 FILE 구조 포인터에서 작동하여 파일 구조 포인터에서 작동하며 여기서는 파일 설명자가 사용됩니다.
파일 설명자의 범위는 0-OPEN MAX입니다. 초기 Unix에서 채택한 상한은 19였습니다(즉, 각 프로세스는 20개의 파일을 열 수 있습니다). 이제 많은 시스템이 곧 63으로 늘어날 것입니다. Linux는 1024입니다. 많은 것이 구체적인가요?
파일 설명자 및 파일 포인터
FILE *fdopen(int fd, const char *mode), 파일 설명자를 파일 포인터로 변환
int fileno(FILE * 스트림), 파일 포인터를 파일 설명자로 변환합니다.
off_t lseek(int fd,off_t offset,int whence);
fd
: 열린 파일에 대한 설명
offset
: 변위량; fd
:已经打开的文件描述符;
offset
:位移量;
whence
:定位的位置,即基准点
SEEK_SET
:将该文件的位移量设置为距文件开始处offset个字节;
SEEK_CUR
:将该文件的位移量设置为其当前值加offset,offset可正可负;
SEEK_END
whence
: 위치 지정 위치, 즉 기준점
SEEK_SET
: 파일의 시작 부분부터 오프셋 바이트로 파일의 오프셋을 설정합니다.
SEEK_CUR
: 파일의 오프셋을 현재 값에 오프셋을 더한 값으로 설정합니다. 오프셋은 양수 또는 음수일 수 있습니다. SEEK_END
: 파일 길이에 오프셋을 더한 값으로 파일의 변위를 설정합니다. 오프셋은 양수 또는 음수일 수 있습니다(이때 양수 값인 경우 구멍 파일과 관련되어 있음). 아래 설명 참조);
lseek 함수를 사용하여 파일 설명자가 파이프나 FIFO를 참조하는 경우 lseek는 -1을 반환하고 errno를 EPLPE로 설정합니다.
hole 파일 예:
#include<stdio.h> #include<fcntl.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<errno.h> //生成空洞文件 char *buffer = "0123456789"; int main(int argc,char *argv[]) { if(argc < 2) { fprintf(stderr,"-usage:%s [file]\n",argv[0]); exit(1); } int fd = open(argv[1],O_WRONLY | O_CREATE | O_TRUNC,0777); if(fd < 0) { perror("open error"); exit(1); } size_t size = strlen(buffer) * sizeof(char); //将字符串写入到空洞文件中 if(write(fd,buffer,size) != size) { perror("write error"); exit(1); } //定位到文件尾部的10个字节处 if(lseek(fd,10L;SEERK_END) < 0) { perror("lseek error"); exit(1); } //从文件尾部的10个字节处再写入字符串 if(write(fd,buffer,size) != size) { perror("write error"); exit(1); } close(fd); return 0; }
more 명령을 사용하여 파일 내용을 보면 표시된 내용이 한 번만 작성한 결과임을 알 수 있습니다. -c 명령을 사용하여 파일의 ASSCI 코드를 보면 두 내용 사이에 10개의 내용이 있음을 알 수 있습니다.
새 파일을 엽니다
원본 바이너리 파일의 일부를 읽어서 새 파일에 씁니다
읽기가 완료될 때까지 반복적으로 읽고 쓰기
그리고 쓰기가 끝나면 중지합니다. ) == 0은 루프를 중지하는 조건으로 사용됩니다. 읽을 수 없으면 완료된 것입니다. 】
완전 복사
복사 완료
파일을 열 때마다 구조체 파일과 같은 구조가 커널에서 생성되어 열린 파일을 나타내고 다음 정보를 기록합니다.
파일 오프셋(0부터 시작, 파일 포인터 오프셋 데이터가 기록됨)
참조 횟수(여러 프로세스가 이 열린 파일을 사용하고 있음)
inode 노드(프로세스의 속성 정보 저장: 누가 생성했는지, 이름은 무엇인지, 디스크는 어디에 있는지) 저장된? 이 inode 노드를 통해 해당 특정 파일을 찾을 수 있습니다)
열기 방법: 읽기 전용 모드, 쓰기 전용 모드 등
테스트 1: 파일을 먼저 열고 포크
close(fd)는 가장 바깥쪽에 쓰여 있으며, 부모 프로세스와 자식 프로세스가 모두 닫힐 때마다 참조 횟수가 0이 될 때까지 1씩 감소합니다.
실행 결과는 다음과 같습니다.
이유는 다음과 같습니다.
테스트 2: 먼저 포크한 후 파일을 엽니다
코드를 수정한 후 실행 결과는 다음과 같이 변경됩니다. :
부모 프로세스와 자식 프로세스가 분리되어 있기 때문에 이후에는 각각의 파일이 열리고, 각각의 구조체 파일이 생성되며, 파일 오프셋은 더 이상 공유되지 않습니다.
실제 애플리케이션 시나리오에서는 주로 상위 프로세스와 하위 프로세스에서 연 파일을 사용하여 이 양식에 액세스합니다.
위 내용은 Linux 운영 파일의 기본 시스템을 호출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!