"유닉스에서 모든 것은 파일이다" - 유닉스프로그래밍 수강하면서 기억나는 말... ㅋㅋㅋ

리눅스를 찬찬히 공부하며 다시 정리해봅니다

 

1. 리눅스 디렉토리 구조

- linux file system hierarchy standard가 존재.

- 제일 상단에 root filesystem(/)가 있는 트리구조.

 

 

2. 디렉토리 종류 및 역할

- /(root) : 최상위 디렉토리

- /bin (/usr/bin) : 리눅스 기본 명령어

- /sbin (/usr/sbin) : 리눅스 시스템 관리용 명령어

- /usr : 애플리케이션, 유틸리티 설치 디렉토리

- /etc : 시스템 설정파일

- /var : 비교적 변동이 잦은 파일 ( /var/log- 로그파일 존재 )

- /tmp : 임시디렉토리

- /proc : 메모리에서 동작중인 프로세스들 정보를 확인

- /sys : 시스템 하드웨어 정보나 가상 파일 시스템들

- /root : 시스템 최고 관리자인 root 사용자의 홈 디렉토리

- /home : 일반 사용자들의 홈 디렉토리 ( ubuntu가 보통 여기 존재 /home/ubuntu 익숙.....)

- /dev : 하드웨어 장치 파일

- /lib : 라이브러리

 

 

3. 기본적인 리눅스 명령어

- pwd : 현재 작업중인 디렉토리 [present working directory]

- cd : 디렉토리 이동 [change directory]

- ls : 위치한 디렉토리의 파일목록 표시 

- mkdir : 디렉토리 생성

- cp : 파일을 복사

- mv : 파일을 이동

- rm : 파일을 제거

- cat : 파일의 내용을 화면에 출력하거나 파일을 만드는 명령어 [ concatenate ]

- chmod : 권한 변경 (rwxrwxrwx)  

- touch : 파일이나 디렉토리의 최근 업데이트 일자를 현재시간으로 변경

- find : 특정 파일이나 디렉토리를 검색한다. [ find 경로  -name 파일명 ]

1. Redirection을 구현

 

Redirection(in) 구현 부

 

Main() 함수에서 자식 프로세스 exec을 수행하기 전에 “<”가 있는지 확인후

 

있을 경우 dup2함수를 이용하여 redirection 기능을 수행하도록 구현 하였습니다.

 

그리고 마지막 for문을 이용하여 이전 커맨드벡터에서 떙겨주었습니다

 

( 리다이렉션 명령어가 들어있던 부분)

 

 Redirection(out) 구현 부

 

마찬가지로 main()함수에서 자식프로세스가 exec을 하기 전에 redir_out함수로 들어가서

 

“>” 명령어가 있는지를 확인하고 있다면 dup2함수를 이용하여 redirection을 수행후

 

마지막 for문을 이용하여 커멘드벡터를 떙겨주었습니다.

 

( 리다이렉션 명령어가 들어있던 부분)

 

2. 파이프 처리 기능

 

받은 커맨드문장(cmdvector) 에서 파이프가 있는지 와 커맨드문장의 어느 위치에 파이프가

 

있는지를 확인합니다.

 

만약 파이프 명령어가 없다면 바로 리턴 합니다.(리턴 값 1)

 

그리고 for문을 통해서 파이프 명령어(“|”) 앞, 뒤 명령어들을 나눠줍니다.

 

그리고 파이프를 생성하여 줍니다.

 

그리고 첫 번째 받은 명령어를 리다이렉션을 이용하여 출력을 돌려줍니다.

 

그리고 함수 내에서 자식을 생성한 후 자식은 두번째 명령어를 실행하는데

 

dup함수와 리 다이렉션을 이용하여 입력을 첫 번째 명령어(cmdpipe1)로부터

 

입력을 받도록 리다이렉션을 합니다.그리고 결과의 출력이 표준출력이 아닌 파이프를

 

통해서 나가도록 파이프출력으로 내보내도록 dup함수를 통해 설정합니다.

 

그 후 exec을 실행합니다.

 

부모 프로세스는 3번째 명령어(cmdpipe3)를 수행합니다.

 

이 프로세는 입력을 파이프를 통해서 입력받도록 dup함수를 이용하여 설정해주고

 

그리고 출력을 redirection을 통하여 조절해줍니다.

 

1) SIGCHLD 로 자식 프로세스 wait() 시 프로세스가 온전하게 수행되도록 구현.

 

 

위와 같이 SIGCHLD 처리를 하여 기존의 백그라운드 수행 후 좀비 프로세스가 생기는 문제 해결.

 

2) ^C(SIGINT), ^\(SIGQUIT) 사용 시 쉘이 종료되지 않도록, foreground 프로세스 실행 시 SIGINT를 받으면 프로세스가 

 

끝나도록 구현.

위와 같이 ^C(SIGINT), ^\(SIGQUIT) 를 쉘 프로세스에서는 이 시그널을 받으면 핸들러로 돌려서 동료되지 않게끔

 

설정하였습니다.

 

그리고 위와같이 쉘프로세스가 아닌 foreground에서 돌아가는 프로세스들은 ^C(SIGINT), ^|(SIGQUIT)

 

이 시그널들을 받으면 정상적으로 종료가 되어야 하기 때문에 exec을 하기전에 위 시그널 들을

 

SIG_DFL 처리 하였습니다. 백그라운드로 수행되고 있는 프로그램들은 종료가 되면 안되므로

 

foreground 프로세스일 경우에만 SIG_DFL을 하고 exec을 하도록 하였습니다.

'학부생 공부 > unix' 카테고리의 다른 글

쉘 구현 (Redirection, 파이프(pipes))  (6) 2020.03.03
파이프(pipes) -1  (0) 2019.11.13
쉘 구현하기 . (백그라운드 실행)  (0) 2019.11.06

+ Recent posts