|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Inheritance
A child process can inherit several properties and resources from its parent process. You can also prevent a child process from inheriting properties from its parent process. The following can be inherited:
· Open handles returned by the CreateFile function. This includes handles to files, console input buffers, console screen buffers, named pipes, serial communication devices, and mailslots. · Open handles to process, thread, mutex, event, semaphore, named-pipe, anonymous-pipe, and file-mapping objects. · Environment variables. · The current directory. · The console, unless the process is detached or a new console is created. A child console process also inherits the parent's standard handles, as well as access to the input buffer and the active screen buffer.
The child process does not inherit the following:
· Priority class. · Handles returned by LocalAlloc, GlobalAlloc, HeapCreate, and HeapAlloc. · Pseudo handles, as in the handles returned by the GetCurrentProcess or GetCurrentThread function. These handles are valid only for the calling process. · DLL module handles returned by the LoadLibrary function. · GDI or USER handles, such as HBITMAP or HMENU.
Inheriting Handles
To cause a handle to be inherited, you must do two things:
· Specify that the handle is to be inherited when you create, open, or duplicate the handle. · Specify that inheritable handles are to be inherited when you call the CreateProcess function.
This allows a child process to inherit some of its parent's handles, but not inherit others. For example, creation functions such as CreateProcess and CreateFile take a security attributes argument that determines whether the handle can be inherited. Open functions such as OpenMutex and OpenEvent take a handle inheritance flag that determines whether the handle can be inherited. The DuplicateHandle function takes a handle inheritance flag that determines whether the handle can be inherited.
When a child process is created, the fInheritHandles parameter of CreateProcess determines whether the inheritable handles of the parent process are inherited by the child process. An inherited handle refers to the same object in the child process as it does in the parent process. It also has the same value and access privileges. Therefore, when one process changes the state of the object, the change affects both processes. To use a handle, the child process must retrieve the handle value and "know" the object to which it refers. Usually, the parent process communicates this information to the child process through its command line, environment block, or some form of interprocess communication.
The DuplicateHandle function is useful if a process has an inheritable open handle that you do not want to be inherited by the child process. In this case, use DuplicateHandle to open a duplicate of the handle that cannot be inherited, then use the CloseHandle function to close the inheritable handle. You can also use the DuplicateHandle function to open an inheritable duplicate of a handle that cannot be inherited.
Inheriting Environment Variables
A child process inherits the environment variables of its parent process by default. However, CreateProcess enables the parent process to specify a different block of environment variables. For more information, see Environment Variables.
Inheriting the Current Directory
The GetCurrentDirectory function retrieves the current directory of the calling process. A child process inherits the current directory of its parent process by default. However, CreateProcess enables the parent process to specify a different current directory for the child process. To change the current directory of the calling process, use the SetCurrentDirectory function.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Наследство
Процесс ребенка может унаследовать несколько свойств и ресурсов из своего родительского процесса. Вы можете также помешать процессу ребенка чтобы наследовать свойства из своего родительского процесса. Следующее может быть унаследовано:
Открытые ручки возвращались функцией CreateFile. Это включает ручкам в файлы, консольные входные буферы, консольные экранные буферы, назвавшие трубы, последовательные устройства связи, и mailslots. Открытые ручки, чтобы обрабатывать, заправлять, mutex, случай, семафор, поименованная-труба, анонимная-труба, и файловое распределение объектов. Переменные Среды. Текущий директорий. Консоль, если процесс не отделен или новая консоль создана. Консольный процесс ребенка также наследует родительские стандартные ручки, а также доступ к входному буферу и активный экранный буфер.
Процесс ребенка не наследует следующее:
Класс Приоритета. Ручки возвращались LocalAlloc, GlobalAlloc, HeapCreate, и HeapAlloc. Псевдо ручки, как в ручках возвращанных GetCurrentProcess или функция GetCurrentThread. Эти ручки будут в силе только для вызова процесса. МОДУЛЬНЫЕ ручки DLL возвращались функцией LoadLibrary. GDI ИЛИ ручки ПОТРЕБИТЕЛЯ, как например, HBITMAP или HMENU.
Наследующие Ручки
Чтобы вызывать ручку, которая нужно наследоваться, Вы должны делать двумя вещи:
Определять, что ручка должна быть унаследована когда Вы создаете, открываете, или дублируете ручку. Определять, что inheritable ручки должны быть унаследованы когда Вы называете функцию CreateProcess.
Это позволяет процесс ребенка, чтобы наследовать некоторые родительские ручки, но не наследовать другие. Например, создание функционирует как например, CreateProcess и CreateFile берет аргумент атрибутов безопасности, который определяет может ручка быть унаследована. Открытые функции как например, OpenMutex и OpenEvent берет флаг наследства ручки, который определяет может ручка быть унаследована. Функция DuplicateHandle берет флаг наследства ручки, который определяет может ручка быть унаследована.
Когда процесс ребенка создан, параметр fInheritHandles CreateProcess определяет унаследованы ручки inheritable родительского процесса процессом ребенка. Унаследованная ручка имеет отношение к тому же объекту в процессе ребенка как есть в родительском процессе. Это также имеет те же привилегии величины и доступа. Следовательно, когда один изменения процесса состояние объекта, изменение влияет на оба процесса. Для того, чтобы использовать ручку, процесс ребенка должен извлечь величину ручки и "знать" объект против которого он отмечается. Обычно, родительский процесс передает эту информацию в процесс ребенка через свою командную строку, блока среды, или некоторую форму межпроцессовой связи.
Функция DuplicateHandle полезная если процесс имеет открытую ручку inheritable, что Вы не хотите быть унаследованы процессом ребенка. В этом случае, использование DuplicateHandle, чтобы открывать дубликат ручки, которая не может быть унаследована, затем использовать функцию CloseHandle, чтобы закрывать ручку inheritable. Вы можете также использовать функцию DuplicateHandle, чтобы открывать дубликат inheritable ручки, который не может быть унаследован.
Наследующие Переменные Среды
Процесс ребенка наследует переменные среды своего родительского процесса по умолчанию. Тем не менее, CreateProcess позволяет родительский процесс, чтобы определять другого блока переменных среды. Более подробно, смотри Переменные Среды.
Наследующий Текущий Директорий
Функция GetCurrentDirectory извлекает текущий директорий вызова процесса. Процесс ребенка наследует текущий директорий своего родительского процесса по умолчанию. Тем не менее, CreateProcess позволяет родительский процесс, чтобы определять другой текущий директорий для процесса ребенка. Для того, чтобы изменять текущий директорий вызова процесса, используйте функцию SetCurrentDirectory.
|
|
|
|
| |