[운영체제 실습] 10.프로세스 생성과 실행

#.프로세스 생성 - system 함수 사용하기

 

예제

결과

system 함수로 실행한 명령인 ps -ef grep han > han.txt 가 실행되고 있다.

 

 

#.fork 함수 특징

1.fork 함수를 호출하면,

2. 새로운 프로세스를 생성한다.

3. fork 함수로 생성한 자식 프로세스의 메모리 공간은 부모 프로세스의 메모리 공간을 그대로 복사해 만든다.

4.fork 함수는 부모 프로세스에는 자식 프로세스 pid를 리턴하고, 자식 프로세스에는 0을 리턴한다.

 

#.자식프로세스가 상속 받는 대표적인 속성

1.실제 사용자 id

2.유효 사용자 id

3.실제그룹 id

4.유효 그룹 id

5.환경변수

6.열린 파일 기술자

7.시그널 처리 설정

8.현재 작업 디렉토리

 

 

#.프로세스 생성 - fork 함수 사용하기

 

예제

결과

부모프로세스는 fork함수의 리턴값으로 자식 프로세스의 id를 받는데, 이를 출력하면 자식 프로세스가 출력한 pid와 같음을 알 수 있다.

 

 

#.프로세스 종료

유닉스는 프로세스가 종료되면 해당 프로세스가 어떻게 종료되었는지를 나타내는 종료 상태를 저장한다. 부모프로세스는 저장된 종료 상태 정보를 사용해 자식 프로세스가 어떻게 종료되었는지 알 수 있다. 자식 프로세스는 부모 프로세스에 자신이 어떻게 종료되었는지 알리는 종료 상태값을 리턴할 수 있다. 

 

_exit 함수는 일반적으로 프로그램에서 직접 사용하지 않고, exit 함수에서 내부적으로 호출 한다. _exit 함수는 시스템 호출로, 프로세스를 종료할 때 다음과 같은 과정을 통해 시스템 관련 자원을 정리 한다.

1.모든 파일 기술자를 닫는다.

2.부모 프로세스에 종료 상태를 알린다.

3.자식 프로세스들에 sighup 시그널을 보낸다.

4.부모 프로세스에 sigchild 시그널을 보낸다.

5.프로세스 간 통신에 사용한 자원을 반납한다.

 

#.exit 와 atexit 함수 사용하기

 

예제

결과

위에서 프로세스 종료시 수행할 작업을 지정하는 함수를 작성했는데, 실제로는 프로세스를 종료할때 반드시 수행해야 할 작업을 실행해야 한다. 예를들어, 로그를 남기거나, 관리자에게 메시지를 보내거나 데이터를 저장하는 등의 작업을 할 수 있다.

 

 

#.exec 함수군 활용

exec 함수군을 사용해 명령이나 실행파일을 실행할 수 있다. exec 함수군은 인자로 받은 다른 프로그램을 자신을 호출한 프로세스의 메모리에 덮어쓴다. 따라서 프로세스가 수행 중이던 기존 프로그램은 중지되어 없어지고 새로 덮어쓴 프로그램이 실행된다. exec 함수군은 path 나 file에 지정한 명령이나 실행 파일을 실행한다.

 

#.execlp 함수 사용하기

 

예제

결과

 

 

#.execv 함수 사용하기

 

예제

결과

 

 

#execve 함수 사용하기

 

예제

 

결과

 

 

 

#.exec 함수군과 fork 함수 

 fork 함수로 생성한 자식 프로세스에서도 부모 프로세스와 같은 코드를 수행했다.

 case 문으로 부모 프로세스와 자식 프로세스가 수행할 코드를 분리하기는 했지만,

 기본적으로 같은 프로그램이다.

 

 그러나 자식 프로세스에서 exec 함수군을 호출 하면 자식 프로세스는 부모 프로세스로부터

 복사한 프로그램과는 다른 명령이나 프로그램을 실행할 수 있다.

 예를들어 쉘에서 어떤 명령이나 파일을 실행하면, 쉘은 fork 함수로 자식 프로세스를 만들고,

 사용자가 입력한 명령이나 파일을 exec 함수군을 사용해 자식 프로세스에서 실행한다.

 이렇게 부모 프로세스와 자식 프로세스가 각기 다른 작업을 수행해야 할 때 fork 와 exec 함수를 같이 사용해야 한다.

 

 

#.exec 함수군과 fork 함수 사용하기

 

예제

결과

실행결과를 보면 자식 프로세스는 ls 명령을 수행했음을 알 수 있다.

 

 

#.프로세스 동기화

정상적인 프로세스 종료 과정이라면, 자식 프로세스가 종료를 위해 부모 프로세스에 종료 상태 정보를 보내고,

부모 프로세스는 이 정보를 받으면, 프로세스 테이블에서 자식 프로세스를 삭제해야 한다.

그러나 자식 프로세스가 모든 자원을 반납했어도 부모 프로세스가 종료 상태 정보를 얻어가지 않거나 자식 프로세스보다 먼저 종료 하는 경우 발생한다.

 

 실행을 종료한 후 자원을 반납한 자식 프로세스의 종료 상태 정보를 부모 프로세스가 얻어가지 않는 경우에는

 좀비 프로세스가 발생한다. 좀비 프로세스는 프로세스 테이블에만 존재한다.

 좀비 프로세스는 일반적인 방법으로 제거할 수 없으며, 부모 프로세스가 wait 관련 함수를 호출해야 사라진다.

 

 

#.wait 함수 사용하기

 

예제

결과

결과는 512(10진수), 0x200(16진수) 로 출력됨을 알 수 있다. 자식 프로세스가 전달한 값은 부모 프로세스에 왼쪽으로 한 바이트 이동해 전달된다. 이를 제대로 출력하려면 오른쪽으로 8비트 이동시켜야 한다. 

 

 

#.waitpid 함수 사용하기

 

예제

결과

 

 

 

예제파일

ch06.zip
0.01MB

 

 

 

 

 

 

======================= 실습 2 ======================= 

 

#.프로세스 실행

#.결과

 printf("end! \n");  이부분이 출력되지 않는다.

 

#.fork 

#.결과

 

 

#.fork와 exec를 이용해서 새로운 프로세스 생성

#.결과

부모프로세스는 자식프로세스가 종료되길 기다렸다가 종료된다.

 

#.고아 프로세스

#.결과

 

#.데몬 프로세스

#.결과

 

ppid 가 1 이되었고, 터미널이 ?? 이되었다.

 

 

 

 

 

 

 

참고 : 유닉스시스템 프로그래밍(한빛미디어) , Joinc