본문 바로가기
프로그래밍/운영체제

C/C++ 뇌를 자극하는 윈도우 운영체제 프로젝트 2.

by Hwan2 2019. 12. 29.
728x90
반응형

윤성우 저자께서 작성하신 "뇌를 자극하는 윈도우 운영체제"의 실습 2번입니다.

 

C언어로 만들어져 있으며 다음과 같은 요구사항을 말하고 있습니다.

 

1. start 입력시 자식프로세스 생성.

2. start echo "문자열" 입력시, 자식프로세스 생성 후 해당 문자열 출력.

 

저는 C++을 사용해 구현했으며, Boost의 tokenizer를 사용했습니다.

 

만든 visualstudio 는 2019 버전을 사용했으며, 다른 버전 사용 시 echo_console.exe 파일 경로가 다를 수 있습니다.

 

소스코드는 아래와 같습니다.

 

 

 

main.cpp

#include <iostream>
#include <tchar.h>
#include <Windows.h>
#include <string>
#include <boost/tokenizer.hpp>
#include <algorithm>
#include <cstdio>

using namespace std;
typedef basic_string<TCHAR> TSTRING;

#define CMD_TOKEN_NUM 10
#define BUFFER 1000

TSTRING ERROR_CMD
= _T("is not execution code. \n");

bool CmdProcessing (void);
TSTRING StrLower(TSTRING);
void Make_Process(TSTRING& , TSTRING);

int _tmain(int agrc, TCHAR * argv[]) {
    _tsetlocale(LC_ALL, _T("Korean"));

    bool isExit = true;
    while (1) {
        isExit = CmdProcessing();
        if (isExit == true) {
            _fputts(_T("command end..... \n"), stdout);
            break;
        }
    }
    return 0;
}

bool CmdProcessing(void) {
    TSTRING cmdString;
    TSTRING cmdTokenList[CMD_TOKEN_NUM];
    _fputts(_T("Best command prompt>> "), stdout);
    getline(cin, cmdString);
    int index = 0;
    //boost::escaped_list_separator<char>
    boost::tokenizer<> tok(cmdString);

    for_each(tok.begin(), tok.end(), [&](auto& s) {
        cmdTokenList[index++] = [&](TSTRING s) -> TSTRING{    //Uppercase -> lowercase
            for (int i = 0; i < s.size(); i++)
                s[i] = tolower(s[i]);
            return s;
        }(s);
    });
    
    if (cmdTokenList[0] == _T("exit"))
        return true;
    else if (cmdTokenList[0] == _T("start")) {
        Make_Process(cmdTokenList[1], cmdString);
        return false;
    }
    else {
        cout << cmdTokenList[0] << ERROR_CMD << endl;
        return false;
    }
    return -1;
}

void Make_Process(TSTRING& cmd, TSTRING echo) {
    TCHAR command[] = _T("..\\..\\echo_console\\x64\\Debug\\echo_console.exe");
    //TCHAR command[] = _T("cmd.exe");
    STARTUPINFO si = { 0, };
    PROCESS_INFORMATION pi;
    si.cb = sizeof(si);
    TCHAR title[] = "echo_console.exe";
    si.lpTitle = title;

    TCHAR c_echo[BUFFER];
    TCHAR sum_echo[BUFFER];
    int len;

    if (cmd == _T("echo")) {
        echo.erase(0, 6);
        len = echo.size();
        echo.copy(c_echo, len);
        c_echo[len] = '\0';
        _stprintf_s(sum_echo, _T("%s %s"), command, c_echo);
    }
    else if (cmd == _T("")) {
        _stprintf_s(sum_echo, _T("%s"), command);
    }
    cout << sum_echo << endl;

    int ischeck = CreateProcess(NULL, sum_echo, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    if (!ischeck)
        cout << "ProcessCreate Error!!" << endl;
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}
​

 

 

 

echo_console.cpp

#include <cstdio>
#include <tchar.h>
#include <iostream>
#include <Windows.h>

using namespace std;

int _tmain(int args, TCHAR * argv[]) {
    cout << " echo_console.exe" << endl;
    int i = 1;

    for(int i = 2; i < args; i++)
        cout << argv[i] << " ";

    cout << endl;

    cin >> i;

    return 0;
}

 

 

github : https://github.com/dnfwlq8054/win_ProcessCreate_simplecode.git

 

 

 

 

 

반응형

'프로그래밍 > 운영체제' 카테고리의 다른 글

C/C++ IPC인 mailslot에 대한 이해  (0) 2020.01.16
C/C++ 프로세스 생성하기.  (0) 2019.12.29
c/c++ TCHAR 정리.  (1) 2019.12.29
유니코드와 아스키코드(SBCS, MBCS, WBCS)  (0) 2019.12.11

댓글


스킨편집 -> html 편집에서