Linux 명령어, System Call, 디버깅 등에 대한 이해
1. mycmd의 동작 이해
- mycmd 실행 결과: (1.clock 2.Processes 3.Editor 4.Exit ) 출력.
- 각 해당번호 입력 입력시 프로그램 실행.
- 1, 2, 3, 4 이외의 번호 입력시 (1.clock 2.Processes 3.Editor 4.Exit ) 재출력.
- 하나의 프로그램 실행 후 다른 해당번호를 입력하면 프로그램 실행 가능.
- 하나의 프로그램 실행 후 다른 해당번호를 입력하지 않으면 프로그램 종료.
2. emacs를 실행하여 위의 동작을 할 수 있는 코드작성.
※ 작성한 코드는 파일로 첨부.
- geetchar()를 이용하여 문자를 입력받고 이에 따라서 각각 동작하도록 if-else
문 형태를 활용하였습니다.
- swich문을 이용하면 좀 더 간단했겠지만 알 수 없는 오류가 발생해서
if - else if 문을 사용하였습니다.
※ 주요함수
forc() 함수
- geetchar()를 이용하여 문자를 입력받고 이에 따라서 각각 동작하도록 if-else
문 형태를 활용하였습니다.
- swich문을 이용하면 좀 더 간단했겠지만 알 수 없는 오류가 발생해서
if - else if 문을 사용하였습니다.
※ 주요함수
forc() 함수
fork()함수는 호출한 프로세스의 복사본 프로세스를 생성합니다. 실패할 경우 -1을 리턴합니다. 성공할 경우 프로세스가 둘로 나뉘어서 원본 프로세스와 복사본 프로세스에게 전달되는 리턴값이 다릅니다. 원본 프로세스의 리턴값은 복사본 프로세스 ID이고, 복사본 프로세스의 리턴 값은 0입니다. fork() 함수 호출 성공시, 부모 프로세스는 자식 프로 세스의 ID를 리턴받고 fork 함수 호출 이후를 실행하게 되고 자식 프로 세스역시 0을 리턴받고 fork함수 호출 이후를 실행하게 됩니다. 실행의 흐름이 두 갈래로 나뉩니다. 그러나 부모프로세스와 자식 프로세스는 같은 프로그램 코드를 서로 다른 공간에서 실행하므로 데이터의 공유는 일어나지 않습니다. 독립된 두 개의 프로그램이 실행되는 것입니다. |
exec() 함수
- 호출하는 프로세스를 새로운 프로세스로 변경시키는데 사용합니다,
- exec후, 프로세스의 개수는 그대로 이면 그 프로세스의 PID 번호도
변경되지 않지만, 프로세스의 내용이 변경됩니다.
- 복귀값
exec()는 성공적으로 마쳐진 경우에는 제어가 복귀되지 않고, 오류
발생시만 -1값을 복귀시킵니다.
- 형식
execl (char*path, char*argo, char*arg1,………,NULL)
execv (char*path, char**argv)
execlp(char*filename, char*argo, char*arg1,………,NULL)
execvp(char*filename, char**argv)
path 실행화일이 있는 곳까지의 전체 경로 이름
argo 실행하고자 하는 프로그램 이름
arg1~argn 실행하고자 하는 프로그램의 인수들
avgv 실행하고자 하는 프로그램의 인수들의 배열
filename 실행하고자 하는 프로그램 이름
3. RCS를 통한 버전관리 및 작성 프로그램 실행.
4. gdb를 이용한 디버깅 실행.
먼저 컴파일 시 디버깅 정보를 삽입하기 위해서 반드시 -g 옵션을 추가하도록 하며 gdb의 인자로 디버깅할 파일 이름을 적어줍니다.
cc -g -o gdb_test (파일명)
gdb gdb_test
그럼 gdb 정보와 함께 (gdb) 콘솔 command로 바뀝니다.
일단 gdb상에서 이 프로그램을 돌려봅니다. 명령어는 run 입니다.
5. Makefile 작성
- Makefile은 명령(command)부분에 정의된 명령들은 의존 관계(depenency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 됩니다. 가령, mcmd.c를 고쳤다고 생각한다면 mycmd.o가 컴파일되어 다시 생기고, mycmd 도 다시 링크되어 갱신됩니다.
- mycmd: mycmd.o ( mycmd.o 를 통해 mycmd.를 만들게 됩니다. )
- mycmd.o: mycmd.c ( mycmd.c 를 통해 mycmd.o.를 만들게 됩니다. )
- clean을 이용하여 지우고자 하는 파일을 설정할 수 있습니다.
※ 가끔 Makefile을 통한 make 잘 안된다는 분.
- 정확히 이해가 가지 않는 부분이지만 본인의 경우에는 Makefile을 RCS를 통해서
버전 관리를 하지 않을 경우 make가 제대로 동작하지 않는 경우가 발생하였습니다.
ex)
- RCS를 통한 버전관리:
압축되어있는 파일을 압축을 푼 후 처음 보이는 폴더에서 바로 make입력시 실행파일 생성.
-버전관리를 안한 Makefile
압축되어있는 파일을 압축을 푼 후 처음 보이는 폴더에서 바로 make되지 않고 그 폴더안에 들어간 후 make입력 시 실행파일 생성.
6. 압축하기
- 압축풀기 gunzip filename.tar.gz ( tar.gz에서 gz를 풉니다..) tar xvf filename.tar ( tar를 풀어냅니다. x : 압축풀기, v : 압축푸는 상태 보기, f : 파일 이름) tar xvzf filename.tar.gz ( tar.gz를 한번에 풉니다. 안될 경우 위의 순차적인 방법으로 합니다.) - 압축하기 tar cvf filename.tar file1 file2 ( file1 file2 등의 파일이나 폴더를 filename.tar로 묶습니다.) gzip filename.tar ( filename.tar를 filename.tar.gz로 압축합니다.) tar cvzf filename.tar.gz file1 file2 ( file1 file2 등의 파일이나 폴더를 filename.tar.gz로 한번에 묶고 압축합니다.) 7. 동작여부 확인 - 압축을 풀면 압축되어있던 폴더가 생성되고 그 상태에서 make를 입력하면 사전에 만들어놓은 Makefile에 의해서 mycmd라는 실행파일이 생성됩니다. - mycmd라는 실행파일과 mycmd.c를 제외한 모든 파일들이 삭제된 것을 볼 수 있습니다. |
# 첨부파일 # ( mycmd.tar.gz )
댓글 없음:
댓글 쓰기