티스토리 뷰
책 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍
일단 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
링크
TAG
- 백준
- Select모델
- 알고리즘
- Dreamhack
- 고양이
- 더블버퍼링
- 개발
- 멀티쓰레드
- 시스템보안
- 워셜알고리즘
- queue
- BFS
- 야경
- 드림핵
- 컨퍼런스
- 학교
- c++
- 레지스터
- STL
- 지뢰찾기
- 자료구조
- 인제대학교
- 정보보안
- 링크드 리스트
- 보안
- 스레드풀
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함