Skip to content

Instantly share code, notes, and snippets.

@east825
Created September 18, 2012 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save east825/3744763 to your computer and use it in GitHub Desktop.
Save east825/3744763 to your computer and use it in GitHub Desktop.
Наследование дескриптора
#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;
}
#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