p 129 char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

8
• 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

description

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 를 함께 사용 - PowerPoint PPT Presentation

Transcript of p 129 char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

Page 1: 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

Page 2: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

• exec 과 fork 를 함께 사용

• wait – 한 프로세스가 자식이 하고 있는 일을 완료할 때를 기다리게 함

( 예제 ) p131 – test2.c

p133

• docommand

-명령을 직접 수행시키지 않고 중간 매개자로서 표준쉘을 호출

-쉘을 호출할 때 사용되는 – c

; 수행해야 할 명령을 표준 입력 대신 바로 뒤의 문자열

인수로부터 취하도록 함 .

-( 예제 ) p134 – test3.c

Page 3: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

5.5 상속된 자료와 파일 기술자

•부모 프로세스가 가지고 있던 변수의 값들은 자식 프로세스에게 그대로 전달

•부모 프로세스에서 개방된 파일은 자식 프로세스에서도 개방

• 자식은 각 파일과 연관하여 자신의 파일 기술자의 복제를 유지

• 각 파일의 읽기 - 쓰기 포인터가 부모와 자식 사이에서 공유

• ( 예제 ) p136 – test4.c

Page 4: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

5.5.2 exec 과 개방된 파일

• 원래의 프로그램에서 개방된 파일들은 exec 가 호출되어서 개방상태 유지

• close-on-exec 플래그가 on 이면 exec 호출 시 파일이 close

• 예제 – p138

Page 5: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

자식 프로세스를 가진 부모 프로세스가 wait 를 호출하면

– 자식 프로세스가 종료할 때까지 실행이 중단된다 . ( 대기 상태 )

– 자식 프로세스가 종료하면 이를 처리한다 .

• wait 호출 이전에 자식이 종료했다면 대기 상태가 되지 않고 처리

#include <sys/types.h> #include <sys/wait.h>

pid_t wait(int *status);

status 자식 프로세스가 exit 함수로 종료하면서 전달하는 종료 상태 값으로 0에서 255 사이의 값을 가진다 .

반환값 호출이 성공했을 경우 종료한 자식 프로세스의 식별 번호가 반환되고 , 실패할 경우 -1 이 반환된다 .

자신의 자식 프로세스가 종료할 때까지 대기한다 . (p140, p141)

Page 6: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

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 을 반환한다 .

프로세스 식별번호로 지정한 자식 프로세스가 종료할 때까지 대기

Page 7: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

좀비와 고아 프로세스의 관리는 결국 시스템의 init 프로세스로 넘겨진다 .

– init 프로세스가 새로운 부모가 된다 .

좀비 프로세스 (zombie process)

부모 프로세스가 wait 를 수행하지 않고 있는 상태에서 자식이 종료

자식 프로세스의 종료를 부모 프로세스가 처리해주지 않으면 자식 프로세스는 좀비

프로세스가 된다 .

좀비 프로세스는 CPU, Memory 등의 자원을 사용하지 않으나 , 커널의 작업

리스트에는 존재한다 .

고아 프로세스 (orphan process)

하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 먼저 종료

부모 프로세스가 수행 중인 자식 프로세스를 기다리지 않고 먼저 종료

init 프로세스

Page 8: p 129  char * const argin[] = {“command”, “with”, “arguments”, (char *)0};

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);