네트워크 프로그래밍을 하더도중…한가지 풀리지 않는 의문점이 생겨 KLDP 게시판에 글을 올렸다.

 내용 보기 : http://kldp.org/node/90394

 글을 올린지 30분도 채 안되서 답변이 올라왔다.

 문제인즉…

 다음과 같은 코드를 실행했을때…
 

(Language : c)
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6.  
  7. void error_handling(char *message);
  8.  
  9. int main(void)
  10. {
  11.     int fildes;
  12.     FILE *fp;
  13.  
  14.     fildes = open(“data.dat”, O_WRONLY | O_CREAT | O_TRUNC);
  15.     if(fildes == -1)
  16.         error_handling(“open() error!”);
  17.    
  18.     /* 파일 디스크립터를 이용하여 파일 포인터 생성 */
  19.     fp = fdopen(fildes, “w”);
  20.     write(fileno(fp), “This is write funcion1!! nn, 27);
  21.     fputs(“This is fputs function!! nn, fp);
  22.     write(fileno(fp), “This is write funcion2!! nn, 27);
  23.    
  24.     fclose(fp);
  25.    
  26.     return 0;
  27. }
  28.  
  29. void error_handling(char *message)
  30. {
  31.     fputs(message, stderr);
  32.     fputc(n, stderr);
  33.     exit(1);
  34. }

 나타나는 결과 화면이 다음과 같다는데 있었다.

사용자 삽입 이미지
 즉 fgets() 함수의 호출 순서와 파일에 입력된 순서가 서로 맞지 않는다는 것이었다.

 이유는 간단했다.

 KLDP의 답글에 올라온 내용처럼 C표준 라이브러리의 입/출력 함수의 경우 자체 버퍼를 따로 가지고 있어서 이를 명시적으로 비워 주지 않으면 문제의 소지가 있다는 것이다.

 물론 명시적으로 해주지 않아도 표준 라이브러리만 사용한다면 문제는 없다. 하지만 지금처럼 시스템 함수와 표준 라이브러리를 병행해서 사용할 경우 위와 같은 문제가 생길 수 있기 때문에 혼용한다면 명시적으로 버퍼를 비워주는 작업이 필요하다.

 다음과 같이 말이다. 위의 코드는 아래의 코드를 추가한 결과 정상적으로 작동하였다.

(Language : c)
  1.     fputs(“This is fputs function!! nn, fp);
  2.     fflush(fp);

 원인을 안다면 해결책은 간단한 법이다.
 

Tags: , , , , ,

Leave a Reply