Как процесс Win32 может получить pid своего родителя?

Достаточно добавить «бесконечность» к вашей анимации, чтобы она запускалась более одного раза: animation: rings 1s infinite;:

"use strict";

const element = document.getElementById("trigger");

element.addEventListener("mouseover", function(e){
  element.classList.remove("animated");
  void element.offsetWidth;
  element.classList.add("animated");
}, false);
body { background: #333;}

#trigger {
    margin: 60px auto;
    padding: 30px;
    position: relative;
    border: 2px solid red;
    width: 300px;
    text-align: center;
}

#trigger * {
     pointer-events: none;
}

#trigger img {
    width: 140px;
    border-radius: 100%;
    padding: 2px;
}

#trigger.animated span {
    border-radius: 100% / 100%;
    position: absolute;
    width: 140px;
    height: 140px;
    border: 2px solid #fff;
    background: #333;
    z-index: -1;
    animation: rings 1s;
}

#trigger span:nth-child(1) {
    animation-delay: 0s;
}

#trigger span:nth-child(2) {
    animation-delay: 0.2s;
}

#trigger span:nth-child(3) {
    animation-delay: 0.4s;
}

@keyframes rings {
    0% {
        opacity: 0;
        transform: scale(1);
    }
    70% { 
        opacity: 1;
        transform: scale(1.3);
        }
    100% {
        opacity: 0;
        transform: scale(1);
    }
}
<div id="trigger" class="animated">
  <span></span>
  <span></span>
  <span></span>
  <img src="https://picsum.photos/140/140" alt="some pic">
</div>
[ 118]

34
задан twk 8 October 2008 в 23:02
поделиться

5 ответов

Заметьте, что, если родительский процесс завершается, это очень возможно и даже вероятно, что PID будет снова использован для другого процесса. Это - стандартная операция окон.

Так, чтобы быть уверенным, как только Вы получаете идентификатор родителя и уверены, что это - действительно Ваш родитель, необходимо открыть дескриптор для него и использование это.

10
ответ дан 27 November 2019 в 16:07
поделиться

На всякий случай кто-либо еще натыкается на этот вопрос и ищет пример кода, я должен был недавно сделать это для проекта библиотеки Python, я продолжаю работать. Вот тест/пример кода, который я придумал:

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

int main(int argc, char *argv[]) 
{
    int pid = -1;
    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);

    //assume first arg is the PID to get the PPID for, or use own PID
    if (argc > 1) {
        pid = atoi(argv[1]);
    } else {
        pid = GetCurrentProcessId();
    }

    if( Process32First(h, &pe)) {
        do {
            if (pe.th32ProcessID == pid) {
                printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
            }
        } while( Process32Next(h, &pe));
    }

    CloseHandle(h);
}
50
ответ дан 27 November 2019 в 16:07
поделиться

, "С другой стороны, кто-то может облегчить мой страх, что изодромное с предварением, я являюсь передающим, могло бы принадлежать другому процессу через какое-то время, если родитель умер?"

Да, PID может быть снова использован. В отличие от UNIX, Windows не поддерживает сильное дерево отношений отцов и детей.

3
ответ дан 27 November 2019 в 16:07
поделиться

Лучший способ сделать это - вызвать DuplicateHandle () для создания наследуемой копии дескриптора вашего процесса. Затем создайте дочерний процесс и передайте значение дескриптора в командной строке. Закройте дублированный дескриптор в родительском процессе. Когда ребенок закончит, ему нужно будет закрыть свою копию.

20
ответ дан 27 November 2019 в 16:07
поделиться
ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
 ULONG_PTR pbi[6];
 ULONG ulSize = 0;
 LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
  PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); 
 *(FARPROC *)&NtQueryInformationProcess = 
  GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
 if(NtQueryInformationProcess){
  if(NtQueryInformationProcess(GetCurrentProcess(), 0,
    &pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
     return pbi[5];
 }
 return (ULONG_PTR)-1;
}
20
ответ дан 27 November 2019 в 16:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: