80 likes | 247 Views
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 를 함께 사용
E N D
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
자신의 자식 프로세스가 종료할 때까지 대기한다. (p140, p141) 자식 프로세스를 가진 부모 프로세스가 wait를 호출하면 • 자식 프로세스가 종료할 때까지 실행이 중단된다. (대기 상태) • 자식 프로세스가 종료하면 이를 처리한다. • wait 호출 이전에 자식이 종료했다면 대기 상태가 되지 않고 처리
프로세스 식별번호로 지정한 자식 프로세스가 종료할 때까지 대기 wait와 waitpid의 차이점 • wait는 자식 프로세스 중 가장 먼저 종료되는 것을 처리해주나, waitpid는 PID로 지정한 자식 프로세스의 종료만 처리해준다. • (예제 – test5.c)
좀비 프로세스 (zombie process) 좀비와 고아 프로세스의 관리는 결국 시스템의 init 프로세스로 넘겨진다. • init 프로세스가 새로운 부모가 된다. 부모 프로세스가 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);