WSP26

LJM·2023년 8월 16일
0

컴퓨터지식

목록 보기
27/41
post-thumbnail

커널 오브젝트의 상태 확인이 필요한 상황의 연출

두개의 프로세스 생성해서 각각 1부터 5까지, 그리고 6부터 10까지 덧셈 후 결과를 반환하게 하자

아래로 내려갈 수록 시간이 흐르는것이다.

PartAdder.cpp

_tmain(int argc, TCHAR* argv[])

DWORD start = _ttoi(argv[1]);
DWORD end = _ttoi(argv[2]);

DWORD total = 0;

for(DWORD i = start; i <= end; ++i)
total += i;

return total;

반환 값은 부모프로세스에게 전달되야 의미를 지닌다

Exit Code 를 활용해서 부모 프로세스에게 데이터를 전달할 수 있다

자식 프로세스가 부모 프로세스에게 데이터를 전달해야만 한다. 즉 프로세스간 통신이 필요한 상황이다. IPC기법을 사용해서 구현하는 것도 가능하다

자식프로세스를(PartAdder.cpp)를 생성해서 덧셈연산을 진행한느 부모 프로세스의 프로그램 코드를 보자

NonStopAdderManager.cpp

_tmain(int argc, TCHAR* argv[])

STARTUPINFO si1={0,};//프로세스의 세팅
STARTUPINFO si2={0,};

PROCESS_INFORMATION pi1;//프로세스와 그 프로세스의 주 스레드에 대한 핸들 및 식별자를 제공
PROCESS_INFORMATION pi2;//프로세스 핸들은 프로세스 커널 오브젝트에 대한 핸들

DWORD return_val1;
DWORD return_val2;

TCHAR command1[] = _T("PartAdder.exe 1 5");
TCHAR command2[] = _T("PartAdder.exe 6 10");

DWORD sum = 0;

si1.cb = sizeof(si1);
si2.cb = sizeof(si2);
CreateProcess(NULL, command1, NULL, NULL, TRUE, 0, NULL, NULL, &si1, &pi1);
CreateProcess(NULL, command2, NULL, NULL, TRUE, 0, NULL, NULL, &si2, &pi2);

CloseHandle(pi1.hThread);
CloseHandle(pi2.hThread);

//hProcess 커널 오브젝트에 대한 핸들
GetExitCodeProcess(pi1.hProcess, &return_val1);//계산결과 받기
GetExitCodeProcess(pi2.hProcess, &return_val2);

if(return_val1==-1 || return_val2==-1)//비정상적 종료
return -1;

sum+=return_val1;
sum+=return_val2;

_tprintf(_T("total: %d \n"), sum);

//커널 오브젝트의 참조 카운트 (또는 사용 카운트)가 감소
CloseHandle(pi1.hProcess);
CloseHandle(pi2.hProcess);

return 0;

위으 코드를 실행하면 55가 출력되어야 하지만 틀린 값이 출력 된다

CreateProcess를 호출한 직후에 GetExitCodeProcess를 호출하고 있습니다. 이는 새로 생성된 프로세스의 실행이 완료되기 전에 종료 코드를 가져오려고 시도하는 것으로 보입니다. 이렇게 되면, 프로세스가 아직 실행 중일 경우 STILL_ACTIVE 상태 코드를 반환할 수 있습니다

profile
게임개발자 백엔드개발자

0개의 댓글