유닉스 시스템 도구
make, 명령행 인자 중요!
유닉스 기본 명령
로그인/로그아웃
- telnet : 유닉스 시스템에 접속 telnet hanb.co.kr
- logout, exit : 유닉스 시스템에서 접속 해제
프로세스 관련 명령
- ps : 현재 실행 중인 프로세스의 정보 출력
- -ef : 모든 프로세스에 대한 상세 정보 출력
- ex) ps / ps -ef / ps -ef | grep ftp
- kill : 프로세스 강제 종료
- -9 : 강제 종료
- ex) kill 5000 / kill -9 5001
파일/디렉토리 조작
- pwd : 현재 디렉토리 경로 출력
- ls : 디렉토리 내용 출력
- -a : 숨김파일 출력
- -l : 파일 상세정보 출력
- ex) ls -ail : 파일의 모든 정보 출력 / ls -a : 간단 출력 / ls -al : 각 파일 url 출력
- cd : 현재 디렉토리 변경
- 상대경로 (pwd: 절대 경로)
- cp : 파일/디렉토리 복사
- -r : 디렉토리 복사
- cp a.txt b.txt / cp -r dir1 dir2
- mv : 파일/디렉토리 이름 변경, 이동 (rename)
- ex) mv a.txt b.txt / mv a.txt dir 1 / mv dir1 dir2
- rm : 파일/디렉토리 삭제
- -r : 디렉토리 삭제
- ex) rm a.txt / rm -r dir1
- mkdir : 디렉토리 생성
- rmdir : 빈 디렉토리 삭제 (안 비어있으면 삭제 안됨)
- cat : 파일 내용 출력 (출력시 vi 명령어도 사용 가능함)
- more : 파일 내용 쪽단위로 출력
- chmod : 파일 접근권한 변경
- ex) chmod 755 a.exe / chmod go+x a.exe
- grep : 패턴 겁색
- ex) grep abcd a.txt
vi 편집기 내부 명령
- esc 버튼 누르고 명령키 입력하면 기능 실행됨 (명령 모드 전환)
- 입력 모드 전환 : i , a, o, O (입력 모드, 수정 모드, 밑의 라인에 입력, 윗 라인에 입력(삽입))
- 커서 이동 : 방향키 (또는 jkhl)
- 한글자수정 : r
- 단어 수정 : cw
- 검색해서 수정 : :%s/aaa/bbb/g
- 붙이기 : p
- 글자 삭제 : x, #x(3x, 5x 등)
- 저장하고 종료 : :wq!, ZZ, :wq
- 행 붙이기 : J(shift-j)
- 행 번호 보이기 : :set nu
- 행 이동 : #G(50G, 143G 등), :행번호
- 여러글자 수정 : #s (5s, 7s 등)
- 명령 취소 : u, U
- 복사 : #yy (5yy, 10yy 등)
- 커서 이후 삭제 : D(shidt-d)
- 행삭제 (잘라내기) : dd, #dd(3dd, 4dd 등)
- 저장하지 않고 종료 : :q!
- 화면 다시 표시 : ctrl + I
- 행번호 없애기 : :set nonu
컴파일
vi(편집기) 이용해 작성한 프로그램을 실행하기 위해서 컴파일 해야 함
gcc : GNU C 컴파일러
vi test1.c
gcc -o test1 test1.c
./test1
- vi test1.c : 파일 생성 (수정)
- gcc -o test1 test1.c : test1.c 파일을 컴파일 한 실행 파일 test1 생성
- gcc test.c 하면 안되는 이유
컴파일한 실행 파일 이름이 전부 똑같아서 어떤 것이 어느 파일의 실행 파일인지 알 수 없게 됨 - ./test1 : 실행 파일명 입력 시 프로그램 실행됨, 현재 디렉토리(.)가 경로에 없으면 명시적으로 지정해야함(./)
- gcc test.c 하면 안되는 이유
Makefile, make
- 소스 파일 여러개를 묶어서 실행파일 생성하는 도구
- touch *.c
- 모든 파일의 수정 시간을 최근으로 만듬
-> make 할 때 모든 파일이 다시 컴파일됨
- 모든 파일의 수정 시간을 최근으로 만듬
- make 만들 때
- 맨 앞은 대문자, 나머지는 소문자로 만들어야 함 (Makefile)
- 실행할 때는 make
- 실행되는 부분은 tap 써야함!
#Makefile
CC = gcc #쉘 변수, gcc 컴파일 사용
CFLAGS= #따로 없음
OBJS=test1.o test2.o
LIBS=
all: add
add: $(OBJS)
$(CC) $(CFLAGS) -o add $(OBJS) $(LIBS)
test1.o: test1.c
$(CC) $(CFLAGS) -c test1.c
test2.o: test2.c
$(CC) $(CFLAGS) -c test2.c
clean:
rm -f $(OBJS) add core
- OBJS
- 실행 파일 만들기 위해 필요한 object file
- 생성할 object file 이름 지정
- all: add
- 생성할 실행 파일명을 add로 지정
- $(CC) $(CFLAGS) -o add $(OBJS) $(LIBS)
- 내가 짠 프로그램 외의 여러가지 시스템 함수 포함하고 있는 obj file과 같이 링크시켜줌
- 실행되는 부분은 TAP만 허용! space 안됨
- $(CC) $CFLAGS) -c test1.c
- 내가 짠 프로그램만 compile
- clean
- 사용 시 make clean
- 필요없는 file 그때그때 삭제 가능
실행 결과
- # : 명령어
- 명령어 밑 : 수행 결과
#make
gcc -c test1.c
gcc -c test2.c
gcc -o add test1.o test2.o
#ls
Makefile add* test1.c test1.o test2.c test2.o
#add
Sum 1~5 = 15
오류 처리 함수
perror
- 일반적으로 많이 사용함
#include <sys/errno.h> //기본적으로 지원하는 error num, 표준문장 있음
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void){
if(access("unix.txt", R_OK) == -1){ //이 파일이 있는지 확인
perror("unix.txt");
exit(1);
}
return 0;
}
//실행 결과
#ex1_4.out
unix.txt: No such file or directory
strerror
#include <sys/errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void){
char *arr;
if(access("unix.txt", R_OK) == -1){
err = strerror(errno);
printf("오류: %s(unix.txt\n", err);
exit(1);
}
return 0;
}
//실행 결과
#ex1_5.out
오류: No such file or directory(unix.txt)
명령행 인자
#include <stdio.h>
int main(int argc, char *argv[]){ //**argv로 쓰기도 함
return 0; //또는 return(0);
}
- argc : 명령행 인자 개수
- argv : 입력받은 명령행 인자
- 명령행 요소의 첫 번째 인자 : 실행파일 이름 (argv[0])
- 두번째 인자부터 입력값 들어감
- char형으로 받게 됨, int형으로 바꾸고 싶으면 atoi()로 바꾸기
- 명령행 인자 사용하는 이유
- 인자 바꾸고 싶을 때 다시 compile 해줄 필요 없이 실행 시에 바꿔주면 됨
-> 편리함 - ex) gcc -o test5 test5.c
./test5 -h 100 ./test5 -u 200
- 인자 바꾸고 싶을 때 다시 compile 해줄 필요 없이 실행 시에 바꿔주면 됨