티스토리 뷰

책 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍

 

일단 echo와 start를 구현하라는 미션이 주어졌습니다. 그래서 단순 echo와 start만 구현했는데, 책에서는 다른것도 구현이 되어있어서 코드가 상당히 달랐습니다.. 그래도 주어진 미션 부분은 비슷했어서 잘 구현된 거 같습니다.

 

내가 구현한 코드

더보기
#pragma warning(disable:4996)
#include<tchar.h>
#include<locale.h>
#include<Windows.h>

#define STR_LEN 256
#define CMD_TOKEN_NUM 10

TCHAR ERROR_CMD[] = _T("'%s'은(는) 실행할 수 있는 프로그램이 아닙니다.\n");

int CmdProcessing(int);
TCHAR* StrLower(TCHAR*);
void ECHO(TCHAR* str);
int CmdReadTokenize(void);

TCHAR cmdString[STR_LEN];
TCHAR cmdTokenList[CMD_TOKEN_NUM][STR_LEN];
TCHAR seps[] = _T(" ,\t\n");

int _tmain(int argc, TCHAR* argv[]) {
	//한글 지원
	_tsetlocale(LC_ALL, _T("Korean"));

	if (argc > 2) {
		for (int i = 1; i < argc; i++)
			_tcscpy(cmdTokenList[i - 1], argv[i]);
		CmdProcessing(argc-1);
	}
	DWORD isExit;
	while (1) {
		int tokenNum = CmdReadTokenize();

		if (tokenNum == 0)
			continue;

		isExit = CmdProcessing(tokenNum);
		if (isExit == TRUE) {
			_fputts(_T("명령어 처리를 종료합니다. \n"), stdout);
			break;
		}
	}
	return 0;
}
int CmdReadTokenize(void) {
	_fputts(_T("Best command prompt >> "), stdout);
	_getts_s(cmdString);

	TCHAR* token = _tcstok(cmdString, seps);

	int tokenNum = 0;

	while (token != NULL) {
		_tcscpy(cmdTokenList[tokenNum++], StrLower(token));
		token = _tcstok(NULL, seps);
	}
	
	return tokenNum;
}
int CmdProcessing(int tokenNum) {
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;
	si.cb = sizeof(si);

	if (!_tcscmp(cmdTokenList[0], _T("exit"))) {
		return TRUE;
	}
	else if (!_tcscmp(cmdTokenList[0], _T(""))) {
		return false;
	}
	else if (!_tcscmp(cmdTokenList[0], _T("echo"))) {
		ECHO(cmdTokenList[1]);
	}
	else if (!_tcscmp(cmdTokenList[0], _T("start"))) {
		TCHAR CopyCmdString[STR_LEN] = _T("TestProject.exe ");
		for (int i = 1; i < tokenNum; i++) {
			_tcscat(CopyCmdString, cmdTokenList[i]);
			_tcscat(CopyCmdString, _T(" "));
		}
		ZeroMemory(&pi, sizeof(pi));
		BOOL isRun = CreateProcess(NULL, CopyCmdString, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
		if (isRun)
			CloseHandle(pi.hProcess);
	}
	else {
		ZeroMemory(&pi, sizeof(pi));
		BOOL isRun = CreateProcess(NULL, cmdTokenList[0], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

		if (isRun == FALSE)
			_tprintf(ERROR_CMD, cmdTokenList[0]);
	}
	_tcscpy(cmdTokenList[0], _T(""));
	return 0;
}

void ECHO(TCHAR* str) {
	_tprintf(_T("%s\n"), str);
}

TCHAR* StrLower(TCHAR* pStr) {
	TCHAR* ret = pStr;

	while (*pStr) {
		if (_istupper(*pStr))
			*pStr = _totlower(*pStr);
		pStr++;
	}

	return ret;
}

'서버 공부 > 시스템 프로그래밍' 카테고리의 다른 글

쓰레드 구현 모델  (0) 2022.07.28
(IPC통신) Named Pipe 통신  (0) 2022.07.27
(C언어) 프로세스 실행 함수 및 실행  (0) 2022.07.27
프로세스란?  (0) 2022.07.26
유니코드 형식 프로그래밍  (0) 2022.07.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함