C에서 stdout 출력 스트림 플러시

Jinku Hu 2023년10월12일
  1. fflush함수를 사용하여 C에서stdout출력 스트림을 플러시합니다
  2. C에서printf함수를 사용하여fflush동작 시연
C에서 stdout 출력 스트림 플러시

이 기사에서는 C에서stdout출력 스트림을 플러시하는 방법에 대한 여러 방법을 보여줍니다.

fflush함수를 사용하여 C에서stdout출력 스트림을 플러시합니다

C 표준 라이브러리는 기본적으로 사용자 공간에서 수행되는 I/O 작업의 버퍼링 된 버전을 나타내는I/O라이브러리,stdio를 제공하여 일반적인 사용 사례에 대한 성능을 향상시킵니다. 일반적으로 파일에 액세스하고 파일에 대한 작업을 수행하는 것은 운영 체제 서비스에서 제공합니다. 따라서 사용자는 결국 시스템 호출이 필요합니다. 파일을 엽니 다. 시스템 호출을 자주 호출하면 운영 체제 커널 데이터 구조에 액세스하고 제어를 앞뒤로 전송해야하므로 프로그램 속도가 느려집니다. 결과적으로stdio함수 호출을 사용할 때 입력 / 출력 작업을 처리하기 위해 C 라이브러리에서 유지 관리하는 버퍼가 있습니다.

사용자가 커널 버퍼에 강제로 기록해야하는 경우fflush함수에서 제공하는 주어진 스트림을 플러시해야합니다. fflush는 주어진 스트림에 대한FILE포인터의 단일 인수를 취합니다. fflush는 입력 스트림 (검색 가능한 파일 포함)에 대해 버퍼링 된 데이터를 버리는 동안 출력 스트림에 대한 쓰기 기능을 강제합니다. 인수가NULL이면 열려있는 모든 출력 스트림을 플러시합니다.

fflush는 커널 버퍼를 플러시해야 하기 때문에 작성된 데이터가 물리적으로 저장되도록 보장하지 않는다(여기 여기에서 본 fsync 호출을 사용하여 수행할 수 있다).

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  char *username;
  size_t len;
  int lnmax = 256;

  username = malloc(lnmax);
  if (username == NULL) perror("malloc");

  printf("Username: ");
  fflush(stdout);
  if (fgets(username, lnmax, stdin) == NULL) exit(EXIT_FAILURE);

  printf("Your username is set to - %s", username);

  exit(EXIT_SUCCESS);
}

출력:

Username: tmp
Your username is set to - tmp

C에서printf함수를 사용하여fflush동작 시연

일부 스트림 (예 :stderr)은 버퍼링되지 않습니다. 대조적으로,stdout스트림에 암시 적으로 쓰는printf함수는 버퍼링되며, 후드 아래에서 반복 할 때마다 단일 문자를 인쇄하는 무한 루프를 실행하면 내부 버퍼가 완전한. 따라서 다음 코드 예제에서는 글 머리 기호 문자를 버스트 인쇄합니다. 반복 할 때마다usleep함수를 호출하여 사람의 눈이 명확하게 관찰 할 수 있도록 실행 속도를 늦 춥니 다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  while (1) {
    printf(".");
    usleep(1e3);
  }

  exit(EXIT_SUCCESS);
}

대안으로,printf호출을stderr스트림으로 인쇄하는fprintf로 대체하면 매초마다 char 인쇄 동작으로 반복적 인 char을 생성합니다. 다시 말하지만, 좋은 데모를 보장하기 위해 매 반복마다 1 초 지연이 적용됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  while (1) {
    fprintf(stderr, ".");
    sleep(1);
  }

  exit(EXIT_SUCCESS);
}

마지막으로, 이전 예제 코드에서 본 것처럼stdout스트림에서 동일한 동작을 모방해야하는 경우printf함수 뒤에fflush호출을 추가 할 수 있습니다. 이렇게하면 반복 할 때마다 C 라이브러리 버퍼가 커널 버퍼에 기록되어 유사한 동작이 발생합니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  while (1) {
    printf(".");
    fflush(stdout);
    sleep(1);
  }

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C IO