fork 함수를 통해 복사된 자식 프로세스는 부모 프로세스와 메모리 공간을 공유하지 않으므로 프로세스간 통신은 운영체제의 도움으로 이루어져야 합니다. 이 때 사용하는 것이 파이프입니다. 파이프는 운영체제가 마련해 준 메모리 공간을 통해 프로세스간 통신이 가능하도록 도와줍니다. #include int pipe(int filedes[2]); //success:0 fail:-1 위 함수를 호출하면 인자로 들어간 배열 두 칸에는 각각의 파일 디스크립터가 담깁니다. 0번째 파일 디스크립터는 데이터 수신하는데 사용되고, 1번째는 데이터를 전송하는데 사용됩니다. 즉 1번은 입구, 0번은 출구가 됩니다. 즉 위와 같은 모양이 됩니다. 만약 부모프로세스에서 1번칸으로써 파이프에 입력을 했다면 자식프로세스는 0번칸으로써 ..
분류 전체보기
저번 휴가 때 갔었던 한식주점 담백! 본가에 너무 오랜만에 내려와서 생긴줄도 모르고 있다가 친구가 데려가줘서 들렸는데 너무 맛있게 다녀왔네요ㅎㅎㅎ 담백의 메뉴표에요! 저는 여기서 수육전골, 묵은지참치김밥, 수제녹차아이스크림을 먹어봤는데 다 정말 너무 맛있더라구요😊 수육전골은 사진을 못찍어서 너무 아쉬워요ㅠㅠ 묵은지 참치김밥은 개인적으로 제 입맛엔 너무 잘 맞았어요!!!! 친구가 맛있다해서 시키는데 김밥이라길래 마음속으로 '김밥이.... 8000원???' 하며 살짝 기대를 안했는데 이게 왠걸 상상 이상의 비주얼에 그에 걸맞는 맛이 기다리고 있었습니다! 살짝 흘린거까지 슥슥 긁어 먹었네요 히히... 수육전골에 묵은지참치김밥까지 클리어하고 먹은 후식 녹차아이스크림! 아 3000원에 저게 다 나오는건 아니고 그..
이 글에는 멀티프로세스 생성 방법에 대한 설명 없이 응용만 합니다. 따라서 멀티프로세스 생성 방법 등은 아래를 참고해주세요. https://pupuduck.tistory.com/63 https://pupuduck.tistory.com/66 지금까지 구현한 에코 클라이언트의 입출력 방식은 입력 -> 데이터가 수신되길 계속 기다림 -> 수신되면 출력 을 반복해왔습니다. 만약 데이터가 수신되지 않는다면 더 이상 입력은 하지 못합니다. 따라서 입출력 루틴을 분할하게 되면 데이터 수신여부와 관계없이 입력을 할 수 있습니다. 또, 입력부와 출력부를 따로 구현할 수 있는 편의성을 갖게 되고, 데이터 송수신이 잦은 프로그램의 성능이 향상됩니다. 송수신 시간을 기다리지 않아, 동일한 시간 내 데이터 송수신 분량이 많아지..
10-4, 10-5에서 쓰인 시그널 핸들링을 이용하면 멀티 프로세스 기반의 다중접속 서버를 구현할 수 있습니다. 위 그림은 이번에 구현할 멀티프로세스 기반 다중접속 에코 서버의 구현모델입니다. 클라이언트의 수가 둘이면 두 개의 자식 프로세스, 다섯이면 5 개의 자식 프로세스를 가지게 됩니다. 따라서 에코서버는 다음의 과정을 거쳐야 합니다. 1. 에코 서버의 부모프로세스는 accept 함수 호출을 통해 연결 요청 수락 2. 이때 얻게 되는 소켓의 파일 디스크립터 자식 프로세스 생성 후 넘겨줌 3. 자식 프로세스는 전달받은 파일 디시크립터를 바탕으로 서비스 제공 여기서 2번은 자식 프로세스는 생성될 때 부모 프로세스를 전부 복사하므로 따로 처리할 과정은 없습니다. #include #include #inclu..
sigaction 함수는 signal 함수를 대체할 수 있고 더 안정적입니다. sigaction 함수는 유닉스 계열 운영체제 별 동작방식에 따른 차이를 보이지 않기 때문입니다. 따라서 요즘은 signal 함수 대신 sigaction 함수를 사용합니다. #include int sigaction(int signo, const struct sigaction * act, struct sigaction * oldact); //success: 0 fail: -1 //signo: 시그널의 정보 //act : 시그널 발생시 호출될 함수의 정보 //oldact: 이전에 등록되었던 시그널 핸들러의 함수 포인터를 얻는데 사용, 필요 없으면 0 전달 위 함수의 호출을 위해서는 sigaction이라는 이름의 구조체를 선언 및 ..
부모 프로세스에서 자식 프로세스의 종료를 계속 확인하기에는 비효율적입니다. 자식 프로세스의 종료를 인식하는 주체는 운영체제이므로 운영체제가 부모 프로세스에게 자식 프로세스의 종료를 알릴 수 있다면 더 효율적일 것입니다. #include void (*signal(int signo, void(*func)(int)))(int); // 시그널 발생시 호출되도록 이전에 등록한 함수의 포인터 반환 위 함수를 시그널 등록 함수라고 표현하는데요, 프로세스가 자식 프로세스의 종료 발생 시 특정 함수의 호출을 운영체제에게 요구하는 "시그널 등록"을 하기 때문입니다. 위 함수를 정리하면 다음과 같습니다. 함수 이름: signal 매개변수 선언: int signo, void(*func)(int) 반환형 : 매개변수형이 int..
프로세스가 할 일을 다 하고도 사라지지 않고 리소스를 차지하고 있는 모습을 가리켜 좀비 프로세스라고 합니다. fork() 함수의 호출로 생성된 프로세스를 종료하는 방법은 인자를 전달하면서 exit를 호출하거나, main 함수에서 return문을 실행하면서 값을 반환하는 경우가 있습니다. exit의 인자 값, return의 반환 값 모두 운영체제로 전달되고, 운영체제는 이 값이 부모 프로세스에게 전달될 때까지 자식 프로세스를 소멸시키지 않는데, 이 상황의 프로세스를 좀비 프로세스라 칭합니다. 따라서 자식 프로세스가 종료되며 나온 반환값이나 인자값이 부모 프로세스에게 전달되어야 좀비 프로세스를 없앨 수 있습니다. 부모 프로세스가 자식 프로세스의 전달 값을 요청하는 방법은 두 가지가 있습니다. 먼저 wait ..
프로세스의 현재 상태를 확인하는 방법은 Process Status의 약자인 ps 명령어를 사용합니다. 그냥 ps만 입력하면 다음과 같이 PID, TTY, TIME, CMD를 출력합니다. PID TTY TIME CMD 211 pts/4 00:00:00 bash 685 pts/4 00:00:00 ps 그리고 ps [옵션] 꼴으로 옵션을 사용할 수 있습니다. 대쉬(-)가 붙거나 붙지 않는 옵션들이 있는데, 이는 Unix98, BSD, GNU 모두 사용법이 다른 옵션들이 있습니다. Unix98에서는 대쉬(-), BSD에서는 대쉬를 사용하지 않고 GNU에서는 대쉬 2개(--)를 사용합니다. 먼저 이 시리즈에서 자주 사용하는 "ps au" 명령어의 a와 u는 다음과 같습니다. a : 현재 터미널의 사용자 고유 프로..