티스토리 뷰

OS/리눅스

Ubuntu16.04 exec 실습

donie 2020. 12. 16. 23:19

1. exec 개념

실행(=프로세스 이미지 교체)

파일 열기. redirection의 일종. sub-shell을 만들지 않고 현재 셸에서 파일을 읽고/쓰고/닫을 수 있는 장점.

exec #<FILE : 읽기용 FILE로 오픈. 오픈된 파일은 fd#번을 할당 받는다. 디폴트=0

exec #>FILE : 쓰기용 FILE로 오픈. 오픈된 파일은 fd#번을 할당 받는다. 디폴트=1

exec #>>FILE : append용 FILE로 오픈.

exec #<&- : #번 fd를 닫는다. 읽기 채널

exec #>&- : #번 fd를 닫는다. 쓰기 채널

exec #<>FILE : 파일을 read, write가 모두 가능하도록 오픈. 흔하지 않다.

 

fd는 child process를 만들면 그에 상속이 된다.

 

2. 파일 열기

 

execfd01.sh 파일을 아래와 같이 작성.

코드 해석:

hello.txt에 "Hello world"라는 문자열을 저장한다.

hello.txt를 10번 fd로 열었다. rw모드

read명령의 -n 옵션(숫자)을 이용해서 5character를 읽도록. 10번 fd로부터.

echo한다.

실행권한을 변경하고 실행하면 Hello가 출력된다.

 

참고) 사용하지 않는 fd값을 지정하면 오류가 발생한다.

echo -n "MSG" >&4

여기서 >&4 는 redirection 내용이다.

echo -n옵션에 대한 매뉴얼 먼저 확인.

실행결과는 다음과 같다.

결론 : fd를 사용하려면 먼저 open해서 열어야 한다.

 

3. 파일 열기, 파일 쓰기

 

exec_rw_fd.sh파일을 아래와 같이 작성한다.

코드 해석: 

fd 0~2는 STD IN/OUT/ERR로 예약되어 있으므로 fd3번부터 시작.

$1 첫번째 argument는 fd3번을 읽기용(<)으로 오픈. 

$2 두번째 argument는 fd4번을 쓰기용(>)으로 오픈.

while loop에서 : (null command) 로 무한 루프.

head명령으로 &3으로부터 stdin을 받음. head명령어에 옵션을 안 주었으니 디폴트 10라인씩 읽어온다. 읽어온 값을 in_string에 저장.

in_string 값이 있는지 확인. 없으면 exit.

echo "---" >&4 : 4번 fd에 구분선 저장.

echo "$in_string" >&4 : 4번 fd에 in_string(읽어온 값) 저장.

실행권한을 변경하고 내용을 읽어들일 oldfile.txt를 만들었다.

위 프로그램을 실행하여 newfile.txt를 확인하면 다음과 같이 잘 동작하였다.

이때 구분선을 18라인씩 하고 싶다면 위 exec_rw_fd.sh파일의 head -18 로 옵션을 넣으면 된다.

 

4. 실습 해보기

 

위는 자식 프로세스에서 실행하기 때문에 cnt값을 받아올 수 없다.

보통 초록색 방법으로 해결하는데, 아래의 exec을 이용해서 현재 셸에서 실행하는 방법으로도 해결이 가능하다.

 

5. 예제

명령을 typing할 때마다 자동으로 뒤에 것이 실행됨.

명령어가 typing될 때마다 중간에 프로그램이 하나 더 껴야할 때 사용하는 기능.

이해가 안된다..

 

6. 실행

socket도 하나의 파일이다. fd값으로 나온다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함