<file_sep>/*
	프로그램 설명 : 메일 슬롯 Sender
*/

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")

int _tmain(int argc, TCHAR* argv[])
{
	HANDLE hMailSlot;
	TCHAR message[50];
	DWORD bytesWritten;

	hMailSlot = CreateFile(
		SLOT_NAME,
		GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);

	if (hMailSlot == INVALID_HANDLE_VALUE)
	{
		_fputts(_T("Unalbe to create mailslot! \n"), stdout);

		return 1;
	}

	while (1)
	{
		_fputts(_T("MY CMD >"), stdout);
		_fgetts(message, sizeof(message) / sizeof(TCHAR), stdin);

		if (!WriteFile(hMailSlot, message, _tcslen(message) * sizeof(TCHAR), &bytesWritten, NULL))
		{
			_fputts(_T("Unable to write!"), stdout);
			CloseHandle(hMailSlot);
			return 1;
		}

		if (!_tcscmp(message, _T("exit")))
		{
			_fputts(_T("Good Bye!"), stdout);
			break;
		}
	}

	CloseHandle(hMailSlot);
	return 0;
}<file_sep>/*
	단순 출력 프로그램
*/

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain2(int argc, TCHAR* argv[])
{
	SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
	

	// GetCurrentProcess() : 현재 실행되고 있는 프로세스 함수를 호출한 프로세스의 핸들을 얻을때 사용하는 함수
	// 반환값을 통해 핸들을 얻게 된다. ( 커널 오브젝트의 핸들(정수))

	while (1)
	{
		for (DWORD i = 0; i < 10000; i++)
			for (DWORD i = 0; i < 10000; i++);

		_fputts(_T("Operation2.exe \n"), stdout);
	}

	return 0;
}<file_sep>#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain0(int argc, TCHAR* argvp[])
{
	STARTUPINFO si = { 0, };

	PROCESS_INFORMATION pi;
	si.cb = sizeof(si);
	TCHAR command[] = _T("Operation2.exe");

	CreateProcess
	(
		NULL, command , NULL , NULL,
		TRUE , 0, NULL , NULL, &si, &pi
	);

	while (1)
	{
		for (DWORD i = 0; i < 10000; i++)
			for (DWORD i = 0; i < 10000; i++);

		_fputts(_T("Operation1.exe \n"), stdout);
	}

	return 0;
}<file_sep>/*
	프로그램 설명 : 프로그램 실행 결과에 따른 반환값 확인
*/

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;
	DWORD state;

	si.cb = sizeof(si);
	si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
	si.dwX = 100;
	si.dwY = 200;
	si.dwXSize = 300;
	si.dwYSize = 200;
	si.lpTitle = _T("return & exit");

	TCHAR command[] = _T("OperationStateChild.exe");

	CreateProcess(NULL, command, NULL, NULL, TRUE,
		CREATE_NEW_CONSOLE,
		NULL, NULL,
		&si, &pi);

	for (DWORD i = 0; i < 10000; i++)
		for (DWORD i = 0; i < 10000; i++);

	GetExitCodeProcess(pi.hProcess, &state);

	if (state == STILL_ACTIVE)
		_tprintf(_T("STILL_ACTIVE \n\n"));
	else
		_tprintf(_T("state: %d \n\n"), state);

	return 0;
}<file_sep>﻿/*
    프로그램 설명 : 명령 프로프트 2차

*/
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>


int CmdProcessing(void)
{
    _fputts(_T("Best command prompt>> "), stdout);
    //_getts_s(cmdString);
}
<file_sep>/*
	프로그램 설명 : 프로그램 실행결과에 따른 반환값
*/

#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	float num1, num2;
	_fputts(_T("Return Value Test \n"), stdout);
	_tscanf(_T("%f %f"), &num1, &num2);

	if (num2 == 0)
	{
		exit(-1); // or return -1;
	}

	_tprintf(_T("Operation Result : %f \n"), num1 / num2);

	return 1;
}<file_sep>/*
	프로그램 설명 
	1~10 까지 덧셈하여 출력
	기존에 지니던 문제점 해결
*/
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _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);

	/**********문제 해결을 위해 추가되는 두줄의 코드 ****************/
	WaitForSingleObject(pi1.hProcess, INFINITE);
	WaitForSingleObject(pi2.hProcess, INFINITE);

	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;
}
<file_sep>/*
	프로그램 설명 : 커널 오브젝트 공유 예제
*/

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain1(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;
	si.cb = sizeof(si);

	TCHAR command[] = _T("Operation2.exe");

	CreateProcess
	(
		NULL, command, NULL, NULL, TRUE , 0,
		NULL, NULL, &si , &pi
	);

	DWORD timing = 0;

	while (1)
	{
		for (DWORD i = 0; i < 10000; i++)
			for (DWORD i = 0; i < 10000; i++);

		_fputts(_T("Parent \n"), stdout);

		timing += 1;
		if (timing == 2)
			SetPriorityClass(pi.hProcess, NORMAL_PRIORITY_CLASS);
	}

	return 0;

}<file_sep>/*
	프로그램 설명 : closeHandle 함수 이해
*/

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, TCHAR* argvp[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;

	si.cb = sizeof(si);

	TCHAR command[] = _T("KernelObjProb2.exe");

	CreateProcess(
		NULL, command, NULL, NULL, TRUE,
		0, NULL, NULL, &si, &pi
	);

	CloseHandle(pi.hProcess);

	return 0;
}