프로세스 생성과 종료 총정리 및 wait 시스템콜 상세

2021. 3. 9. 18:04Computer(인강)/시스템 프로그래밍

728x90
반응형

안녕하세요 bannavi입니다^ㅅ^

오늘은 프로세스 생성과 종료에 대해 총정리 해보는 시간을 갖겠습니다

바로 시작하겠습니다!

 

 

 

우선 새로운 프로세스를 생성할때는 부모프로세스안에 fork()라는 명령을 넣어서 

동일한 데이터를가진 프로세스 공간을 생성함.

 

그럼 자식 프로세스도 동일한 프로세스를 갖게되고

fork()를 실행한 다음칸에 pc가 놓여져서 다음 라인부터 실행을 할텐데

 

이 return값이 pid값을 주는데 pid값을 기반으로 자식 프로세스냐, 부모 프로세스냐를 구분할 수 있고

자식프로세스와 부모프로세스의 이 pid값을 기반으로 조건문을 사용해서,

 

자식 프로세스인 경우에는 exec()프로그램으로 시스템콜로 인자를 실행파일이름을 넣어서 실행을 시키면

해당 실행파일 이미지로 자식프로세스가 덮어씌워지고 

다시 해당 파일의 처음부터 실행되게 된다.

 

그럼 그때부턴 부모프로세스와는 다른 프로세스가 생성이 되서 실행이 가능하다.

 

그래서 fork()가 1번이고

자식 프로세스에서 exec()가 2번이다

이때, 이 조건문에서 부모 프로세스는 wait 시스템콜을 써야하죠?

이유는 리눅스의 프로세스 생성 실행 구조가 부모프로세스에서 자식프로세스를 fork()가 exec를 통해서 만들고 

그다음, 자식프로세스가 끝나기 전까진 부모 프로세스가 끝나면 안되고,

자식 프로세스가 끝나면, 자식 프로세스가 어떻게 종료했는지를 상태정보를 알아내서,

그 상태정보에 맞게 뒷처리 작업을 해준뒤에 부모프로세스가 끝나든가 해야한다.

 

이렇게 하는것이 리눅스에서 프로세스를 실행시키는 전체 큰 아키텍쳐이죠.

 

그래서 부모 프로세스에서는 wait() 시스템콜 함수를 실행해서 절대 자식프로세스가 죽기전까진 부모 프로세스가 죽지 못하도록

대기를 걸어놓는것이 권장되는 프로그래밍 기법이다.

 

 

그 다음. 이제 자식프로세스에서 실행파일이 실행되고 난 다음에는 마지막에 끝날때 결국에는 status정보를 넣어줘서(종료상태 정보를 넣어줘서) exit()함수를 실행하더라.

그럼 부모프로세스에는 시그널이 보내진다(자식프로세스가 죽으면 부모프로세스에 보내주는 시그널이 있다: SIGCHILD)

부모 프로세스에서는 지금 wait를 걸어두었는데 이 시그널을 받게되면, 

이 wait가 풀리면서 이 wait다음에 있는 코드가 실행이 되게 됩니다.

 

 

 

만일 status 값을 넣었는데 0이 나왔다면, 자식 프로세스가 정상 종료하지 않았다는것을 의미합니다.

 

 

그리고 wait의 리턴값은 종료된 자식프로세스의 pid가 리턴값으로 들어오게 됩니다.

정상적인 경우에는 종료된 자식프로세스의 pid값이 리턴된다고 보면 좋을것같습니다.

 

코드 예시

코드로 이 내용만 추가했다고 하십니다.

바로 실행 시켜보았습니다.

 

 

위에는 자식 프로세스가 실행이 되어서, (ls -al 명령이 실행 되어서) 파일 리스트가 나온 것이고요 

그 다음 이 두번째 줄은 부모 프로세스아이디와 자식프로세스아이디가 출력된 모습인데

둘이 다른걸 확인하실 수 있죠?

그 바로 밑에줄에는 자식프로세스가 정상적으로 종료되었음도 확인할 수 있네요

728x90
반응형