본문 바로가기
코스웨어/15년 스마트컨트롤러

20150728-3번-권오민 - 멀티 프로세스 프로그래밍

by 알 수 없는 사용자 2015. 7. 28.
728x90
반응형

네트워크

 

소스 파일

client.c, server.c

멀티 프로세스 프로그래밍

fork()

- 리눅스는 프로세스를 복사할 수 있다.

- fork 함수가 바로 그 역할을 한다.

 

- 세포로 분열을 본 따서 fork함수를 호출한 프로세스를 부모 프로세스(parent process), 새로 만들어진 프로세스를 자식 프로세스(child process)라고 한다.

 

fork() 실습

- fork를 통해 2개가 생성되는지를 확인한다.

- Source Coding

- 처음 실행 결과는 다음과 같다.

 

- ps -aux | grep main1 명령을 통해 PID를 확인할 수 있다.

- main1이 각각 다른 PID2개 실행되고 있다.

- 소스에 포함된 2번의 getchar()로 인해 엔터를 2번 입력한 최종 결과는 다음과 같다.

 

 

 

자식 기다리기

- fork()를 통해 복사를 하더라도 이름만 다를 뿐 동등하다.

- 부모는 자식의 번호(PID)를 알 수 있다.

- 자식의 프로그램이 끝났는지를 알 수 있다.

- Source Coding

- 결과

- 쉘의 특수 변수

- echo $? : 최근 실행된 명령어의 리턴 값을 저장하고 있다.

- 좀비 프로세스

- wait 함수를 호출하지 않으면 발생한다.

- 아무 일도 하지 않는다.

- 쓸모가 없다.

- 메모리를 차지하고 있다.

- 운영체제에 있어서 일종의 자원낭비이다.

 

 

client.c        <파일 첨부 : client.c>

- 먼저 client.c를 수정한다.

- 현재 작성된 client.c는 키 입력을 받아야 메시지 수신이 가능하다.

- 키 입력과 메시지 수신을 fork()를 사용하여 별개로 분리한다.

- 수정 전 소스

- 수정 후 소스

- 결과

 

 

 

server.c        <파일 첨부 :server.c>

- 일반적으로 서버가 다수의 클라이언트를 처리하므로 Server를 수정한다.

- server는 대화에 관여하지 않고 클라이언트끼리 통신이 가능하게 수정한다.

- 기존에 소스는 accept가 되면, 소켓을 닫아버린다.

- 2명 이상의 접속이 불가하다.

- fork()를 통해 부모와 자식으로 분리하여 역할을 부여한다.

- 부모 : 랑데뷰

- 자식 : 커뮤니케이션 소켓

- 결과1

- 결과2

- 문제점 발생 : 클라이언트의 채팅내용을 Server만 볼 수 있다.

- 결과3

- 문제점 발생 : 종료가 되지 않는다.

 - 정리가 좀 조잡합니다;; ㅠ

- 수정 및 추가사항 댓글로 달아주세요.

728x90