APUE 입 출력: 버퍼 없 는 I/O

2609 단어
입력 과 출력 1, 파일 설명자 파일 설명자 (file descriptor) 는 커 널 이 특정한 프로 세 스 에서 파일 에 접근 할 때 커 널 이 프로 세 스 에 되 돌아 오 는 비 마이너스 정수 로 이해 할 수 있 습 니 다.커 널 에서 open 이나 creat 를 사용 하여 기 존 파일 을 열거 나 새 파일 을 만 들 때 파일 설명 자 를 되 돌려 주 고 read 나 write 에 매개 변수 로 사용 합 니 다.2. 표준 입력, 표준 출력 과 표준 오 류 는 관례 에 따라 새로운 프로그램 을 실행 할 때마다 모든 셸 은 세 개의 파일 설명자 (0, 1, 2), 즉 표준 입력 (standard input), 표준 출력 (standard output) 과 표준 오류 (standard error) 를 엽 니 다.나의 이해: 표준 입력 은 터미널 (Terminal) 에 대응 하 는 키보드 에서 입력 하 는 것 입 니 다. 표준 출력 은 터미널 화면 에서 직접 출력 해 야 합 니 다. 표준 오류 도 터미널 화면 에 직접 표 시 됩 니 다.3. 버퍼 가 없 는 I/O 함수 open, read, write, lseek 와 close 는 버퍼 가 없 는 I/O 를 제공 합 니 다.이 함수 들 은 모두 파일 설명 자 를 사용한다.버퍼 가 없 는 I/O 는 이 함수 들 이 시스템 호출 을 직접 하 는 것 을 말 합 니 다. 즉, 사용자 가 사용 할 때 스스로 버퍼 를 만 든 다음 에 스스로 이 버퍼 를 관리 해 야 합 니 다.표준 I/O 는 시스템 자체 가 사용자 층 에 버퍼 를 만 들 었 을 것 입 니 다. 사용자 가 만 들 필요 가 없습니다. 또한 이 버퍼 의 관리 알고리즘 은 큰 소 들 이 작성 한 것 으로 매우 효율 적 이 며 일반 사용자 의 손 찢 기 버퍼 보다 훨씬 효율 적 이 어야 합 니 다.
네티즌 들 이 정리 한 데이터 흐름 경 로 는 다음 과 같 습 니 다. 캐 시 없 는 IO 작업 데이터 흐름 경로: 데이터 - 커 널 캐 시 구역 - 디스크 표준 IO 작업 데이터 흐름 경로: 데이터 - 스 트림 캐 시 구역 - 커 널 캐 시 구역 - 디스크
책 속 에는 이런 실례 가 있다
#include "apue.h"
 
#define BUFFSIZE    4096          //缓冲区的长度
 
int
main(void)
{
    int     n;
    char    buf[BUFFSIZE];         //用户自己弄的缓冲区
 
    while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)        // STDIN_FILENO 就是标准输入的文件描述符 值为0 //这条语句就是从标准输入里读
        if (write(STDOUT_FILENO, buf, n) != n)             // STDOUT_FILENO 就是标准输出的文件描述符 值为1//这条语句就是写入标准输出
            err_sys("write error");                    //err_sys 是大师自己写的一个出错处理
 
    if (n < 0)
        err_sys("read error");
 
    exit(0);
}

 이 예 는 버퍼 가 없 는 I/O 를 사용 하여 표준 입력 에서 읽 고 표준 출력 에 쓰 는 것 입 니 다.
#include "apue.h"
 
int
main(void)
{
    int     c;
 
    while ((c = getc(stdin)) != EOF)          // stdin表示标准输入  
        if (putc(c, stdout) == EOF)        //stdout表示标准输出  与stdin一同在头文件<stdio.h>中定义的
            err_sys("output error");
 
    if (ferror(stdin))
        err_sys("input error");
 
    exit(0);
}

 이 예 는 표준 I/O 를 사용 하여 표준 입력 에서 데 이 터 를 읽 고 표준 출력 에 쓰 는 것 입 니 다.이 안에 EOF, EOF 가 있 습 니 다. < stdio. h > 헤더 파일 에서 값 을 - 1 로 정의 합 니 다.getc 는 표준 I/O 함수 이 며, 함수 getc () 는 흐름 에서 문 자 를 가 져 오 는 데 사용 되 며, 원형 은 int getc (FILE * stream) 입 니 다. 인자 * steam 은 문 자 를 읽 을 파일 흐름 입 니 다.읽 은 문 자 를 되 돌려 줍 니 다.파일 끝 에 데이터 가 없 을 때 - 1 (EOF) 을 되 돌려 줍 니 다.
EOF 의 값 은 - 1 이기 때문에 다음 과 같은 표기 법 도 있 습 니 다.
while(~getc()){
          
}

- 1 의 반 코드 는 0 이기 때문에 이 함 수 는 파일 이 끝 날 때 까지 이 순환 을 멈 출 것 입 니 다.

좋은 웹페이지 즐겨찾기