강의자료(1027)

Download Report

Transcript 강의자료(1027)

Chapter 5
-exec에 의해 전달된 인수에의 접근
. main함수를 통해 인수 전달
main(int argc, char **argv) {
}
. 만일 execvp에 의해 호출된다면,
char * const argin[] = {“command”, “with”, “arguments, (char *)0};
execvp(“prog”, argin);
argc == 3;
argv[0] == “command”;
argv[1] == “with”;
argv[2] == “arguments”;
argv[3] == (cjar *)0;
(실습) 한 프로그램에서 exec를 사용하여 다른 프로그램을 수행시켜 볼 것
(example) p130 – test1.c test2.c
- ftw예제 프로그램을 동일한 방법으로 실행시킬 것 (test4.c)
• exec과 fork를 함께 사용
• wait – 한 프로세스가 자식이 하고 있는 일을 완료할 때를 기다리게 함
(예제) p131 – test5.c
p133
• docommand
-명령을 직접 수행시키지 않고 중간 매개자로서 표준쉘을 호출
-쉘을 호출할 때 사용되는 –c
;수행해야 할 명령을 표준 입력 대신 바로 뒤의 문자열 인수로부터
취하도록 함.
(예제) test9.c
5.5 상속된 자료와 파일 기술자
•부모 프로세스가 가지고 있던 변수의 값들은 자식 프로세스에게 그대로 전달
•부 모 프 로 세 스 에 서 개 방 된 파 일 은 자 식 프 로 세 스 에 서 도 개 방
• 자식은 각 파일과 연관하여 자신의 파일 기술자의 복제를 유지
• 각 파일의 읽기-쓰기 포인터가 부모와 자식 사이에서 공유
• (예제) p136 – test6.c
5.5.2 exec과 개방된 파일
• 원래의 프로그램에서 개방된 파일들은 exec가 호출되어서 개방상태 유지
• close-on-exec 플래그가 on이면 exec 호출 시 파일이 close
fcntl (fd, F_SETFD, 1)
• 예제 – p138
자신의 자식 프로세스가 종료할 때까지 대기한다. (p140, p141)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
status
자식 프로세스가 exit 함수로 종료하면서 전달하는 종료 상태 값으로 0에
서 255 사이의 값을 가진다.
반환값
호출이 성공했을 경우 종료한 자식 프로세스의 식별 번호가 반환되고, 실
패할 경우 -1이 반환된다.
자식 프로세스를 가진 부모 프로세스가 wait를 호출하면
–
자식 프로세스가 종료할 때까지 실행이 중단된다. (대기 상태)
–
자식 프로세스가 종료하면 이를 처리한다.
• wait 호출 이전에 자식이 종료했다면 대기 상태가 되지 않고 처리
• P140 `~ 142
프로세스 식별번호로 지정한 자식 프로세스가 종료할 때까지 대기
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid
자식 프로세스의 식별 번호이다.
status
자식 프로세스가 exit 함수로 종료하면서 전달하는 종료 상태 값이다.
options
부모 프로세스의 대기 방법을 선택한다. 일반적으로 0이 사용된다.
pid가 -1이고 options 인수가 0이면 wait와 동일
반환값
호출이 성공했을 때 종료한 자식 프로세스가 있다면 자식 프로세스의 식별
번호가 반환되고, WNOHANG 옵션을 사용할 때 종료한 자식 프로세스가
없으면 0을 반환한다. 호출이 실패할 경우 -1을 반환한다.
wait와 waitpid의 차이점
–
wait는 자식 프로세스 중 가장 먼저 종료되는 것을 처리해주나, waitpid는 PID로 지
정한 자식 프로세스의 종료만 처리해준다.
–
(예제 – test7.c)
좀비 프로세스 (zombie process)
부모 프로세스가 wait를 수행하지 않고 있는 상태에서 자식이 종료
자식 프로세스의 종료를 부모 프로세스가 처리해주지 않으면 자식 프로세스는 좀비 프
로세스가 된다.
좀비 프로세스는 CPU, Memory 등의 자원을 사용하지 않으나, 커널의 작업 리스트에
는 존재한다.
고아 프로세스 (orphan process)
하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 먼저 종료
부모 프로세스가 수행 중인 자식 프로세스를 기다리지 않고 먼저 종료
init 프로세스
좀비와 고아 프로세스의 관리는 결국 시스템의 init 프로세스로 넘겨진다.
–
init 프로세스가 새로운 부모가 된다.
smallsh : 명령 처리기
(실습)
•
자식이 오늘 날짜를 묻는다
- execl(“/bin/echo”, “echo”, “Today’s”, “date”, “is:”, 0)
• 자식 프로세스가 완전히 끝날 때까지 대기
• 날짜 출력
-args[0] = “date”;
-args[1] = “+%A, %B %d, %Y”;
-args[2] = NULL;
-execv(“/bin/date”, args);