작은 분야의 일을 훌륭하게 해내는 자그마한 도구들을 개발자들에게 제공하고 개발자들은 이 도구들을 창의적으로 결합하여 사용하자. 9. C 프로그래밍 도구 (유닉스 철학 하나) 작은 분야의 일을 훌륭하게 해내는 자그마한 도구들을 개발자들에게 제공하고 개발자들은 이 도구들을 창의적으로 결합하여 사용하자.
9.1 C언어 9.2 단일모듈 프로그램 번역(컴파일) 디버깅 라이브러리 유지 프로 파일링 소스코드를 지원하는 도구 프로그램 작성 및 실행 소스 파일 작성 : vi , emasc 편집기 사용 번역 링크 실행
9.2 단일모듈 프로그램 프로그램 번역 다중모듈 프로그램 재사용 함수 컴파일 하기 cc SourceFile -o ExecutableFile (또는 gcc SourceFile -o ExecutableFile) -o : 실행 파일 이름 명시, 디폴트는 a.out (예) $ cc reserve.c a.out 실행파일 생성 $ cc reserve.c -o reverse reverse 실행파일 생성 에러발생 메시지 출력, 실행파일 생성 안됨 에러 수정 후 컴파일 성공 실행 파일 생성 다중모듈 프로그램 새 프로그램 개발시 기존의 프로그램 활용 cut and paste : 동일코드중복 다중모듈 프로그램 : 함수 공유, 유용 재사용 함수 특정 기능 수행부분을 별도로 독립시켜 번역 목적 모듈끼리 링크 시켜 실행(reusable) 목적 모듈 작성 : cc의 -c 옵션 사용
9.3 다중 모듈 프로그램 목적 모듈 링크 ld (gcc 에는 없음) CC -c SourceList : -c 옵션 사용 cc -c reverse.c main1.c cc reverse.o main1.c a.out 실행파일 생성 cc -c reverse.c main1.c cc -c main1.c cc reverse.o main1.o -o main1 main1 실행파일 생성 ld (gcc 에는 없음) 여러 목적모듈 링크시에 호출되는 유닉스의 독립적인 로더 명시된 목적모듈과 라이브러리 모듈을 서로 링크하여 실행파일 생성 ld -n -Lpath * objMoudle * library * -lx * [ -o outputfile] -o : 실행파일이름 지정, 디폴트는 a.out -n : 동적 링크 모듈에 반대되는 독립적 수행파일 생성 -l : ld의 표준 디렉토리(/lib, /usr/lib) 탐색 -L : -lx 옵션에 탐색경로 추가 #include <stdio.h> 디폴트 표준 헤더 파일 경로 /usr/include에서 찾아 옴 #include “reverse.h” 상대경로에서 찾아 옴
9.3 다중 모듈 프로그램 다중모듈 프로그램 유지 make ar sccs 유닉스 파일 의존 시스템 목적모듈과 실행 파일의 최신버전의 유지를 보증 ar 유닉스 파일 보관 시스템 목적 모듈을 저장 sccs 유닉스 소스 코드 관리 시스템 소스 파일과 헤더 파일들의 각 버전을 추적
9.4 유닉스 파일 의존 시스템 : Make 기능 다중 모듈 프로그램의 재사용을 유지하고, 프로그램 수정에 대한 재번역을 최소화 makefile 파일의 상호 의존 관계의 목록 make make파일을 참조하여 파일을 최신버전으로 개정 make [ -f makefile ] -f : 파일이름 명시 기본이름 : Makefiles 복수개의 파일과 목적 파일 컴파일 makefiles 이름에 제한이 없으나 파일 이름 뒤에 .make 표기 권장
9.4 유닉스 파일 의존 시스템 : Make makefiles 작성 및 규칙 targetList : dependencyList commandList targetList : 목적 파일 목록 dependencyList : 의존 파일 목록 commandList : 명령어 목록 (예) main1 : main1.o reverse.o cc main1.o reverse.o -o main1 main1.o : main1.c reverse.h cc -c main.c reverse.o : reverse.c reverse.h cc -c reverse.c
9.4 유닉스 파일 의존 시스템 : Make main1 main1.o reverse.o main1.c reverse.h (예) 규칙을 순서대로 조사하면서 상호 의존 트리를 작성 make는 leaf노드에서 root노드까지 진행하면서 부모 노드의 마지막 수정시간이 자식노드의 수정시간보다 이전이거나 없으면 명령어 목록대로 수행 main1 main1.o reverse.o main1.c reverse.h reverse.c
9.4 유닉스 파일 의존 시스템 : Make make 실행 touch 매크로(Macros) 그 외 정보들 (예) $ make -f main1.make cc -c main.c cc -c palindrome.c -o main2 번역의 단순화를 위해 중복 번역요소 제거 touch 지정된 파일의 수정일자를 현재의 시스템 시간으로 변경 touch -c { fileName } + -c : 지정 파일이 없을 경우 파일 생성 안함 매크로(Macros) make에서 지원하는 기능 make 파일 내에 모든 $(token)는 replacementText로 대치 token = replacementText 규칙 .c.o: $(CC) $(CFLAGS) $(CPPFLAGS) -c $< CFLAGS= -O (예) cflags= -g (gdb를 위한 디버깅 정보 포함) –p (모든 매크로 정의 출력) 그 외 정보들 $ man make
9.5 유닉스 파일 보관 시스템 : AR make는 파일규칙을 모두 식별해야 하는 단점 archive ar 목적모듈을 구성하고 그룹화 시키기 위한 유닉스 파일 보관 시스템 .a 확장자를 갖는 특별한 archive 형식의 파일 생성 archive 파일에 어떤 유형의 파일이라도 추가하고, 삭제하고, 바꾸고, 덧붙인다. archive의 목차(table of content)를 제공한다. ar 사용자가 archive를 생성하고, 다룰 수 있게 한다. archive 파일로부터 필요로 하는 목적 모듈은 필요에 따라 자동적으로 링크 목적모듈 링크 시에 유틸리티에 대한 매개변수 감소로 효율성 증대
9.5 유닉스 파일 보관 시스템 : AR ar key archiveName fileName+ archiveName .a로 끝나도록 되어 있음 key d archive로부터 파일을 삭제 q 이미 존재하고 있어도 archive 파일의 끝에 덧붙임 r 파일이 archive 내에 존재하지 않으면 추가하고 , 존재하지 않으면 현재 버전을 치환 t 표준출력으로 archive의 목차를 보여 줌 x archive로부터 파일들을 현재의 디렉토리로 복사 v 긴 출력으로 보여 줌
9.5 유닉스 파일 보관 시스템 : AR Archive의 생성 파일의 추가 파일 덧붙이기 목차 얻기 파일 제거 파일 추출 첫 번째 파일 추가 시에 자동 생성 파일의 추가 명명된 archive 파일에 파일을 추가, 없을 시 생성 ar r archiveName { fileName }+ (예) ar r atring.a reverse.o palindrome.o 파일 덧붙이기 기존의 archive 파일에 목록이 있어도 무조건 덧붙임 ar q archiveName { fileName }+ 목차 얻기 ar t archiveName { fileName }+ 파일 제거 ar d archiveName { fileName }+ 파일 추출 archive로부터 파일들을 현재의 디렉토리로 복사, 디폴트는 모든 파일 추출 ar x archiveName { fileName }+
9.5 유닉스 파일 보관 시스템 : AR make 시스템을 이용한 archive 유지 makefile내에 목적 모듈을 대신하여 archive 파일을 선언 할 수 있음 archive 파일의 유지 상태에 따라 makefile이 자동적으로 유지 Archive 순서 정하기 (Solaris 2.6~ 해당 사항 없음) 기본적으로는 순서를 영향을 받지 않음 목적모듈 생성에 있어서 순서에 영향을 받을 경우(구식 시스템) ⇒ loader, tsort를 이용해 archive 파일 내의 순서 정렬 목차(A table of Contents) 생성 (‘no table of content’ 에러 시) (Solaris s.6~ 해당 사항 없음) ranlib : 명시된 archive에 목차를 추가, archive내에 _SYMDEF라는 엔트리를 삽입 ranlib archive +
9.6 유닉스 소스 코드 제어 시스템 : SCCS 소스 코드의 모든 파일에 저장, 접근, 보호 유틸리티 이용 admin : 함수의 초기버전 생성시 sccs 파일 형식으로 저장, 일반적인 편집방식이 안됨 get : 최근의 파일버전을 먼저 검사, 표준형식의 텍스트 파일 생성, 이전 버전 획득 delta : 새버전 완성 시에 sccs 파일로 변환시킴, 새로운 버전의 파일 생성 시에 이전 버전과의 차이만을 저장 (기억장소 최소화) get 으로 반환 전까지는 타인의 접근 제한 sact : 지정된 sccs 파일의 현재 편집활동을 보여줌 help : 에러 발생 시에 메시지 코드 값을 가지고 원인
9.6 유닉스 소스 코드 제어 시스템 : SCCS sccs 파일 생성 파일 검사하기 admin 유틸리티를 사용하여 생성 admin -iname -flname -dllist -ename -aname sccsfile -i name 파일로부터 "s."로 시작되는 sccsfile 이라는 sccs 파일을 생성 -fl 지정된 파일 리스트들을 접근제한 -dl 지정된 파일 리스트들을 접근제한 해지 -e sccs 파일중 편집 버전에 접근 가능 사용자의 목록 추가 -a sccs 파일중 편집 버전에 접근 가능 사용자의 목록 삭제 에러발생시 help 참조 help message + 파일 검사하기 get : sccs 파일로부터 지정 버전 파일의 수정 내용을 검사, 디폴트는 최근 버전 get -e -p -rrevision sccsfile -e 파일이 수정 가능함, delta 로 반환되어야 하고, 그렇지 않으면 읽기 전용으로 반환되지 않음 -p 표준 출력에 표시될 파일을 읽기 전용 복사본 생성
9.6 유닉스 소스 코드 제어 시스템 : SCCS 버전번호 형식 sccs 동작의 모니터링 복사된 파일의 버전번호를 명기해야 하며 디폴트는 1.1 delta를 통해 자동적으로 증가 release.delta (예) $ get -e s.reverse.c 1.1 new delta 1.2 29 lines sccs 동작의 모니터링 scat 명시된 파일과 연관된 현재의 활동목록을 보여줌 현재의 편집활동을 표시 출력파일은 기존이나 새로운 delta 버전, get-c가 실행된 날짜와 시간 포함 scat sccsfile +
9.6 유닉스 소스 코드 제어 시스템 : SCCS 검사 취소 / 파일 반환 unget get의 실행 이전의 상태로 반환 전 상태 sccs 파일로 재 저장하고, 비 sccs 파일을 삭제하고 잠금을 해제함 unget -rrevision -n sccsfile + -r 버전 지정 -n 검사 버전은 남기고, 대신 파일을 복사하게 함 (예) $ scat s.reverse.c No outstanding deltas for : s.reverse.c
9.6 유닉스 소스 코드 제어 시스템 : SCCS 새로운 delta 생성 파일의 히스토리 얻기 delta delta -rrevision -n sccsfile + -r 2개 이상의 구분되는 버전 중 지정 파일만 반환 -n -r 옵션의 기능에 반대 한번에 여러 개의 파일 편집가능 버전을 명시해서 편집 파일의 히스토리 얻기 prs sccs 파일의 히스토리 출력, 디폴트는 모든 히스토리 prs -rrevision sccsfile + -r 버전 지정 출력 형태 : 00000/00000/00000 ⇒ 삽입된 줄 수/삭제된 줄 수/바뀌지 않은 줄 수
9.6 유닉스 소스 코드 제어 시스템 : SCCS sccs 식별 키워드 읽기 전용 복사 파일의 경우 get에 의해 처리하는 특수 문자 소스 프로그램에는 영향이 없으나 소스 파일 앞부분, 주석부분에 위치 현재의 시간 %T% %H% 현재의 날짜 %D% release, delta, branch, seqeuence 번호 %I% 소스코드 파일의 이름 %M% 다음으로 치환 문자열
9.6 유닉스 소스 코드 제어 시스템 : SCCS 이전 버전의 읽기 전용 복사본 검사 버전 삭제 sccs 파일의 압축 (예) $ get -r1.1 s.reverse.c 1.1 23 lines 버전 삭제 rmdel 버전이 잎노드인 경우, sccs 파일로부터 명시된 버전을 삭제 $ rmdel -rrevision sccsfile sccs 파일의 압축 comb sccs 파일을 압축하여 소스의 최근 버전만 포함,필요한 delta 제거, 실제 압축은 Borun 셸 스크립트를 생성함으로 동작(저장 후 실행 할 것) $ comb { sccsfile } +
9.6 유닉스 소스 코드 제어 시스템 : SCCS sccs 파일에 대한 접근 제한 잠금 사용자와 그룹의 접근을 제한 : admin 유틸리티의 -e, -a 옵션을 사용 잠금 편집 방지 : admin 유틸리티의 -fl, -dl의 옵션을 사용
9.7 유닉스 수행 감시기 (Profiler): prof 프로그램 수행에 있어서 함수별 시간 소비 정보 출력 ⇒ 함수 최적화 정보 prof 유닉스 수행 감시기(profiler)로 profileFile의 성능 추적을 기반으로 executableFile내의 각 함수의 반복과 시간표 생성 prof -ln [ executableFile [ profileFile ] ] profileFile 디폴트는 mon.out cc -p 번역되어야 함 executableFile 디폴트는 a.out -l 이름순으로 정보를 정렬, 디폴트는 시간의 역순으로 나열 -n 축적된 시간에 의하여 정보를 정렬
9.8 이중 검사 프로그램 : lint C 프로그램을 cc 보다 완전하게 프로그램을 검사 지정된 소스 파일을 스캔하여, 발견된 모든 잠재적 오류를 출력 lint { fileName } * 모듈 화된 프로그램을 검사 시에, 모든 소스를 지정하면 모듈간의 상호작용까지 검사 multi.incheon.ac.kr에서 splint 이용 가능
9.9 유닉스 디버거 : gdb 프로그램을 기호적으로 디버깅 : dbx, adb, sdb, gdb, ddd(Motif) 등 단일단계이동(single stepping) 정지점(breakpoint) 디버거 내에서 편집 변수의 접근 및 수정 함수의 탐색 추적(tracing) gdb GNU debugger, 별도의 프롬프트 표시 관련정보는, 프롬프트에서 help를 입력 dbx executableFilename 디버그를 위한 프로그램 준비 cc 또는 gcc의 -g 옵션으로 프로그램을 번역 ⇒ 목적 모듈 내에 디버깅 정보 포함
9.9 유닉스 디버거 : gdb gdb 실행 % gdb 실행파일이름 gdb 명령어 b (breakpoint) : 실행 중 디버그를 위해 멈추는 위치 지정 b 함수명 : 함수명에서 멈춤 b 라인번호 : 라인번호에서 멈춤 r (run) : 실행 시작 n (next) : 현재 라인 실행 (함수의 경우 실행하고 다음 라인으로 넘어 감) s (step) : 현재 라인 실행 (함수의 경우 호출된 함수 내로 들어가 실행 계속) c (continue) : 다음 breakpoint까지 실행 l (list) : 현재 수행되고 있는 라인부터 10개 라인씩 연속적으로 소스 코드를 프린트 p (print) 변수명 : 변수명으로 저장되어 있는 내용을 프린트 h (help) : 도움말 q (quit) : gdb 종료
9.10 작업 완료 후 : strip 저장 공간 확보 디버거나 수행감시 유틸리티 수행 후에 추가 되는 특별한 코드들 제거 심볼 테이블과 재배치, 디버깅, 프로파일링 정보를 명명된 파일들로부터 제거 strip { fileName }+
과제…12월 9일(월)까지 [과제 1] 교재 p425 연습문제 1 [과제 2] multi.inchon.ac.kr(211.119.245.149) ~mysung/2002prog/cprog에 있는 화면단위로 화일 내용을 출력하는 p 프로그램 가져와서 upgrade % p 화일이름 버전1: 페이지당 줄 수를 명령 줄로부터 입력 받아 변수 pagesize에 지정 % p -n 버전2: 이전의 입력 부분을 재 출력하는 기능을 추가 ( ‘b’ 등의 입력으로 이전출력) 과제 제출 방법 Electrical Version : multi.inchon.ac.kr (211.119.245.149)의 ~mysung/2002unix/에 자신의 학번으로 디렉토리 만들고 그 안에 복사 Paper Version : 종이에 소스와 실행 과정 및 결과 출력하여 제출 Unix 시스템의 루트 활용 권한 부여 받을 사람 지원하세요!