• Make를 쓰는 이유

 - 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약

 - 프로그램의 종속 구조를 빠르게 파악 할 수 있으며 관리가 용이

 - 단순 반복 작업 및 재작성을 최소화


  • Makefile의 구성

 - 목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일 

 - 의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료

 - 명령어(Command) : 실행 되어야 할 명령어들

 - 매크로(macro) : 코드를 단순화 시키기 위한 방법


  •  Makefile 만드는 이유

 - 하나의 실행파일을 생성하는데 필요한 c파일이 여러 개인 경우 그만큼의 명령어가 필요하다. 이러한 상황을 해결해 주기 위해 makefile

 을 사용한다.





문제 13) 문제 12와 동일한 mainAlg 실파일이 만들어 질 수 있도록 make 유틸리티를 실행할 수 있는 Makefile 파일의 내용을 쓰세요.


1. Makefile을 만들기 위해 printMain.c 와 printmsg.c 파일을 만든다.




1) ‘printMain’와 ‘printmsg’ 파일 2개를 생성한다.

위의 사진은 ls의 명령어를 통해 파일이 생성되었는지 확인하는 장면이다.


 (1) 각 object 파일을 생성한다.

 gcc -c -o printMain.o printMain.c

 gcc -c -o printmsg.o printmsg.c


 이때, 

 -c 옵션 : object 파일을 생성

 -o 옵션 : 생성 될 파일 이름을 지정


 각 object 파일을 묶어 실행파일 생성한다.

 gcc -o mainAlg printMain.c printmsg.c


 실행 후 출력한다.

 ./mainAlg


2. Makefile을 생성


 1) Makefile 생성 방법




 

 2) 생성

  mainAlg : printMain.o printmsg.o

               gcc -o mainAlg printMain.o printmsg.o

  printMain.o : printMain.c

                   gcc -c -o printMain.o printMain.c

  printmsg.o : printmsg.c

                  gcc -c -o printmsg.o printmsg.c

  clean :

           rm *.o mainAlg 

  



3. 실행화면




 


 

느낀점 : Make를 사용하면 어떤 장점이 있는지 알지 못하고 무작정 외우기만 했다. 여러 번 힘들게 명령어를 작성하여 실행하는 과정을 make를 사용하면 간편하게 처리할 수 있다는 장점이 있다. 이러한 장점을 적용할 수 있었던 계기가 됬다.

  • 코드

 

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

 


  • 오류경고

 


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

 


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

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파일을 컴파일하는 과정에서 오류를 찾는 일은 아직까지 익숙하지 않다.

1. Putty  실행 전 ssh를 ubuntu에 설치


http://software.naver.com/software/summary.nhn?softwareId=MFS_116451


  •  Root 계정으로 전환
  •  Apt-get install ssh


 2. Putty  실행하기



 

  • Host Name에 server ip 주소를 입력한다.
  • 이후 open하여 연결 -> 네트워크 연결이 안될 시 연결이 되지 않는다.

 


  • ID 와 password 입력하여 접속한다.

이 때, 터미널권한부여를 해주어야 한다.


  • 권한부여 방법 

  - sudo visudo 명령어 입력한다.

  - %sudo 밑에 %(ID) ALL=(ALL:ALL)ALL을 입력한다.





  • Putty ip 주소 입력 후, ssh 연결이 되면 같은 방식으로 vi (파일명).c로 접속하여 파일을 확인한다.



 




 

  • 마지막으로 ./a.out으로 실행하게 되면 c파일이 실행된다.

+ Recent posts