Created
September 18, 2012 18:13
-
-
Save east825/3744763 to your computer and use it in GitHub Desktop.
Наследование дескриптора
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <windows.h> | |
#include <stdio.h> | |
// сообщение для записи в файл | |
#define MESSAGE "child process message" | |
int main(int argc, char *argv[]) | |
{ | |
printf("in child process\n"); | |
if (argc != 2) { | |
printf("use: %s <filehandle>\n", argv[0]); | |
getchar(); // чтобы можно было увидеть сообшение об ошибке | |
return 1; | |
} | |
// получаем числовое значение дескриптора из аргумента | |
HANDLE hFile = (HANDLE)atoi(argv[1]); | |
printf("file handle: %u\n", hFile); | |
DWORD nWritten; | |
int len = sizeof(MESSAGE) - 1; | |
WriteFile(hFile, MESSAGE, len, &nWritten, NULL); | |
if (nWritten != len) { | |
printf("Write error: %x\n", GetLastError()); | |
CloseHandle(hFile); | |
getchar(); | |
return 2; | |
} | |
getchar(); | |
CloseHandle(hFile); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Windows.h> | |
#include <stdio.h> | |
// путь к исполняемому файлу дочернего процесса | |
#define CHILD_PROCESS_PATH "d:\\Dropbox\\education\\projects\\semester9\\system\\lab1\\Debug\\inherited-handle.child.exe" | |
// сообщение для записи в файл | |
#define MESSAGE "main process message\n" | |
int main(int argc, char *argv[]) | |
{ | |
printf("in main process\n"); | |
// открываем файл, устанавливая разрешение на наследование получаемого дескриптора | |
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; | |
HANDLE hFile = CreateFile("file.out", GENERIC_WRITE, 0, &sa, OPEN_ALWAYS, 0, 0); | |
// буфер для получения команды запуска процесса с аргументом | |
char buf[300]; | |
printf("file handle: %d\n", hFile); | |
sprintf(buf, "%s %u", CHILD_PROCESS_PATH, (int)hFile); | |
// пишем подготовленное сообщение в файл | |
DWORD nWritten; | |
int len = sizeof(MESSAGE) - 1; // длину можно получить и так, поскольку сообщение задано литералом | |
WriteFile(hFile, MESSAGE, len, &nWritten, NULL); | |
if(nWritten != len) { | |
printf("Write error: %x\n", GetLastError()); | |
return 1; | |
} | |
// создаем дочериний процесс | |
STARTUPINFO startupInfo; | |
ZeroMemory(&startupInfo, sizeof(startupInfo)); | |
startupInfo.cb = sizeof(startupInfo); | |
PROCESS_INFORMATION processInfo; | |
if(!CreateProcess(NULL, buf, // полученная строка для запуска процесса | |
NULL, NULL, TRUE, // разрешаем наслеование дексрипторов | |
CREATE_NEW_CONSOLE, // новая консоль для наглядности | |
NULL, NULL, &startupInfo, &processInfo )) { | |
printf("Can't create process: %x\n", GetLastError()); | |
return 2; | |
} | |
CloseHandle(hFile); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment