• 코드

 

위의 코드를 작성했더니아래와 같은 경고와 오류가 발생했다.

 


  • 오류경고

 


WARNING : format '%d' expects argument of type 'int', but argument type int 2 has type '__off_t {aka long int}' [-Wformat=]

Warning의 이유는 지난번과 같이 메모리가 깨지는 것으로 casting 할 필요성이 있다.


참고)  http://sojeong2.tistory.com/5?category=719060



ERROR : 'struct stat' has no member named 'st_fstype' printf("File system: %s \n", finfo.st_fstype);

그렇다면 에러를 확인해보자! 

확인해보니 struct에 st_fstype이 지원하지 않는다는 오류 메시지였다.

이에 마지막줄은 제거하고 (long long)을 통해 casting 해주었다.

 

또한 추가해서,

1.     #include <Stdlib.h> : C언어의 표준 라이브러리로문자열 변환의사 난수 생성동적 메모리 관리 등의 함수들을 포함하고 있다.

2.     #include <time.h> : C언어의 표준 라이브러리로시간과 날짜를 얻거나 조작하는 함수들을 포함하고 있다.

을 작성했다.

 


  • 오류 정리 후실행되는 모습

 

 

느낀점 : 윈도우보다 리눅스에 관한 정보들이 열악하여 찾기는 쉽지 않았다그러나 리눅스 또한 조금씩 익숙해져 가는 것 같다. Putty 또한 지금은 손 쉽게 이용하고 있다.

  • 코드



  • 코드 분석


Test.txt를 생성하여 초접근 권한을 0755로 설정하였다. 그러나 19행의 제한으로 인해 실제로는 0400이 설정된다.

이후 파일을 닫고 test.txt 파일에 대해서 쓰기 작업(W_OK)을 할 수 있는지 검사한다.

접근 권한을 0644로 변경하고 *소프트 링크를 생성한다.

31행에서 생성된 소프트 링크 파일의 실제 내용을 읽어서 표준 출력한다.

이러한 정보는 구조체 변수 FINFO저장한 후 출력한다.


*소프트 링크(심볼릭 링크) : 기호화 된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별한 종류의 파일이다.





이 때, 경고 창 2개가 뜬다.


 - format '%d' expects argument or type 'int', but argument 2 has type '__off_t {aka long int}' [-Wformat=]

 - format '%d' expects argument of type 'int', but argument 2 has type '__blkcnt_t {aka long int}' [-Wformat=]


그러나 경고를 무시하고 실행해도 출력 할 수 있다.




하지만 경고가 궁굼하다면 경고의 메시지를 검색해보자!


경고 설명 :

%d는 정수형 출력해 주는 형식문자 이지만, strlen()라는 함수의 반환형은 매크로 자료형이다. 따라서 서로 자료형이 맞지 않다는 경고창을 주는 것이라고 나와있다.


해결 :

1) %d → %s로 변경해보겠다. (실패)

전혀…… 경고가 없어지지 않았다.


다시 한번 경고를 확인해보니 int형의 메모리는 4바이트로, long은 8바이트이다. 이 때, int형 자리에 long의 반환형 값이 들어가게 되면 format이 깨진다는 메시지이다.


2) 이를 해결하기 위해서는 %zu 또는 %ld를 통해 casting해주어야 한다. 코드를 경고 창이 뜨는 줄에 %d → $zu로 변경하니, 아래와 같이 경고 창이 없어졌다.

 


느낀점 : 굳이 큰 메모리를 사용할 필요가 없음에 우리는 간편하고 쉽게 자료형을 변환했다. 그러나 이번 기회를 통해 자료형 변환 과정에 있어서 메모리가 손상될 수 있다는 사실을 알 수 있었다. 메모리를 간과할 수 있는 프로그램은 없다고 생각한다. 다시 한번 메모리에 대해 생각해보게 된 계기가 된 것 같다.

+ Recent posts