p 129 char * const argin[] = {“command”, “with”, “arguments”, (char *)0};
description
Transcript of p 129 char * const argin[] = {“command”, “with”, “arguments”, (char *)0};
• p 129
char * const argin[] = {“command”, “with”, “arguments”, (char
*)0};
execvp (“prog”, argin)
argc == 3;
argv[0] == “command”;
argv[1] == “with”;
argv[2] == “arguments”;
argv[3] == (char *)0
( 예제 ) myecho.c, test1.c
• exec 과 fork 를 함께 사용
• wait – 한 프로세스가 자식이 하고 있는 일을 완료할 때를 기다리게 함
( 예제 ) p131 – test2.c
p133
• docommand
-명령을 직접 수행시키지 않고 중간 매개자로서 표준쉘을 호출
-쉘을 호출할 때 사용되는 – c
; 수행해야 할 명령을 표준 입력 대신 바로 뒤의 문자열
인수로부터 취하도록 함 .
-( 예제 ) p134 – test3.c
5.5 상속된 자료와 파일 기술자
•부모 프로세스가 가지고 있던 변수의 값들은 자식 프로세스에게 그대로 전달
•부모 프로세스에서 개방된 파일은 자식 프로세스에서도 개방
• 자식은 각 파일과 연관하여 자신의 파일 기술자의 복제를 유지
• 각 파일의 읽기 - 쓰기 포인터가 부모와 자식 사이에서 공유
• ( 예제 ) p136 – test4.c
5.5.2 exec 과 개방된 파일
• 원래의 프로그램에서 개방된 파일들은 exec 가 호출되어서 개방상태 유지
• close-on-exec 플래그가 on 이면 exec 호출 시 파일이 close
• 예제 – p138
자식 프로세스를 가진 부모 프로세스가 wait 를 호출하면
– 자식 프로세스가 종료할 때까지 실행이 중단된다 . ( 대기 상태 )
– 자식 프로세스가 종료하면 이를 처리한다 .
• wait 호출 이전에 자식이 종료했다면 대기 상태가 되지 않고 처리
#include <sys/types.h> #include <sys/wait.h>
pid_t wait(int *status);
status 자식 프로세스가 exit 함수로 종료하면서 전달하는 종료 상태 값으로 0에서 255 사이의 값을 가진다 .
반환값 호출이 성공했을 경우 종료한 자식 프로세스의 식별 번호가 반환되고 , 실패할 경우 -1 이 반환된다 .
자신의 자식 프로세스가 종료할 때까지 대기한다 . (p140, p141)
wait 와 waitpid 의 차이점
– wait 는 자식 프로세스 중 가장 먼저 종료되는 것을 처리해주나 , waitpid 는 PID 로 지정한
자식 프로세스의 종료만 처리해준다 .
– ( 예제 – test5.c)
#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 을 반환한다 .
프로세스 식별번호로 지정한 자식 프로세스가 종료할 때까지 대기
좀비와 고아 프로세스의 관리는 결국 시스템의 init 프로세스로 넘겨진다 .
– init 프로세스가 새로운 부모가 된다 .
좀비 프로세스 (zombie process)
부모 프로세스가 wait 를 수행하지 않고 있는 상태에서 자식이 종료
자식 프로세스의 종료를 부모 프로세스가 처리해주지 않으면 자식 프로세스는 좀비
프로세스가 된다 .
좀비 프로세스는 CPU, Memory 등의 자원을 사용하지 않으나 , 커널의 작업
리스트에는 존재한다 .
고아 프로세스 (orphan process)
하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 먼저 종료
부모 프로세스가 수행 중인 자식 프로세스를 기다리지 않고 먼저 종료
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);