• 코드



  • 코드 분석


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로 변경하니, 아래와 같이 경고 창이 없어졌다.

 


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

Putty를 이용하여 ‘temp.txt’ 생성과, txt안에 문장을 출력까지 하고자 한다.

 

먼저, putty에 원격으로 연결하여 로그인한다. 이후 vi 명령어를 통해 test0404.c파일을 연다.

 


Char pathname[] = “temp.txt”;

If((filedes = open(pathname, O_CREAT | O_RDWR, 0644)) == -1)

위의 코드는 ‘temp.txt’라는 파일을 생성하는 코드이다. 

아래 if문은 예외처리하기 위함이다.

Content는 txt파일에 넣을 내용이다.





사진은 컴파일 한 후,  ls 명령어를 사용하여 txt파일이 생성되었는지 확인한 것이다.





‘temp.txt’를 열어보면 위에 putty를 통해 c파일에 작성한 내용을 확인할 수 있다.  

리눅스 폴더에서 또한 ‘temp.txt’가 생성되었는지 확인할 수 있다.  







느낀점 : 처음 ‘temp.txt’를 생성 후 위의 c파일을 컴파일 하였더니, 계속해서 열 수 없다는 오류 메시지가 출력되었다. 이에 명령어 rm을 사용하여 txt파일을 삭제한 후에 컴파일 했다. 비교적 지난번 처음 putty를 사용했을 때보다 쉽고 편했다. 그러나 리눅스에서 c파일을 컴파일하는 과정에서 오류를 찾는 일은 아직까지 익숙하지 않다.

+ Recent posts