본문 바로가기
IT창고/System

비동기 IO / IOCP(윈도우에만 있다.)

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    #include<windows.h>
    #include<stdio.h>
    #include<conio.h>
    DWORD WINAPI foo(void *p)
    {
    	HANDLE hPort = (HANDLE)p;
    
    	//이제 IOCP의 오나료 Q에 완료된 비동기 작업을 들어 올때 까지 대기한다.
    	DWORD key;
    	DWORD bytes;
    	OVERLAPPED * ov;
    	while(1)
    	{
    		GetQueuedCompletionStatus(hPort, &bytes, &key, &ov, INFINITE);
    
    		printf("비동기 작업이 완료 되었습니다.\n");
    		printf("완료키 : %d\n", key);
    		printf("Bytes  : %d\n", bytes);
    	}
    	return 0;
    }
    void main()
    {
    	HANDLE hFile = CreateFile("COM1", //Serial Port Open
    		GENERIC_WRITE,
    		FILE_SHARE_READ | FILE_SHARE_WRITE,
    		0,
    		OPEN_EXISTING,
    		//FILE_ATTRIBUTE_NORMAL,//동기적으로 OPEN
    		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//비동기적으로 오픈
    		0);
    	if(hFile == INVALID_HANDLE_VALUE)
    	{
    		printf("COM1 을 Open할 수 없습니다.\n");
    		return ;
    	}
    	const int size =1024;
    	char buf[size];
    	DWORD len = 0;
    ///*---------------------------------------------------------------------------------------------------------------
    	//IOCP(입출력 완료포트)를 생성한다.
    	HANDLE hPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
    											0,
    											0,
    											2);// 동시에 대기 가능 스레드수
    
    	//완성된 IOCP에 파일의 핸들을 추가한다.
    	CreateIoCompletionPort(hFile, hPort, 1, //완료키
    		                                 2);
    
    	//새로운 스레드르 만들어서 비동기 IO의 완료를 처리한다.
    	HANDLE hThread = CreateThread(0,0,foo,(void *)hPort,0,0);
    	CloseHandle(hThread);
    
    	//---------------------------------------------------------
    	// 이제 비동기 작업을 수행한다.
    
    	OVERLAPPED ov = { 0 };
    	BOOL b = WriteFile(hFile, buf, size, &len, &ov);
    
    	//다른작업 ....비동기 작업 완료시 처리는 다른 스레드가 해제 한다.
    	getch();
    
    	//비동기로 출력한다.
    
    //---------------------------------------------------------------------------------------------------------------
    //*/
    /*
    	//비동기적으로 출력한다.
    	//---------------------------------------------------
    	OVERLAPPED ov = {0}; //비동기적으로 할때 쓴다.
    	ov.hEvent		= CreateEvent(0,0,0,"e"); // 작업당 한개의 Event를 준다.
    	ov.Offset		= 0;
    	ov.OffsetHigh	= 0; //작업당 별개의 파일 offset을 제공한다.
    	ov.Internal		= 0;
    	ov.InternalHigh	= 0; //OS가 내부적으로 사용하는 항목 -  사용자는 변경하지 않는다.
    	//---------------------------------------------------
    	BOOL b = WriteFile(hFile, buf, size, &len, &ov);
    											//  ↑ 0이면 동기 OVERLAPPED 변수가 들어가면 비동기
    	if(b == TRUE)
    	{
    		printf("동기적으로 파일 출력완료 \n");
    	}
    	//--------------------비동기 구간-------------------------
    	else if(b == FALSE && GetLastError() == ERROR_IO_PENDING)
    	{
    		printf("비동기적으로 작업중.......\n");
    		//다른 작업을 마친후 파일작업을 끝날때 까지 기다리려면
    		WaitForSingleObject(ov.hEvent, INFINITE);
    		
    		//WaitForSingleObject(hFile, INFINITE); // 비동기적으로 할때 가끔쓰나 느려서 잘 안쓴다.
    
    		printf("비동기 작업완료 !!\n");
    	}
    	//--------------------비동기 구간-------------------------
    	else 
    		printf("실패\n");
    	CloseHandle(hFile);*/
    }
    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."