Pergunta

Ao criar um processo filho em C ++ usando a API do Windows, pode -se permitir a herança de alças de pai para filho. Em um exemplo da Microsoft "Criando um processo infantil com entrada e saída redirecionadas", redirecionando a DST de um processo infantil para dentro/fora para tubos criados pelos pais, é necessário permitir a herança para que os tubos de redirecionamento sejam utilizáveis.

Estou trabalhando em uma pequena classe de demonstração que inicia um executável externo, lê a saída e depois o cospe de volta ao chamador (que registra a saída retornada em um arquivo). Estou tentando construir um recurso de tempo limite, onde ele apenas bloqueará por um certo período de tempo antes de ligar TerminateProcess() na criança e continuando com a vida.

No entanto, descobri que, permitindo a herança do manuseio, o processo infantil também tem um identificador (visível com Process Explorer) para o arquivo de saída. Eu não quero que o processo filho obtenha esse identificador, mas os pais neste caso (esta classe de demonstração) também não estão cientes do identificador, então não posso usar no momento SetHandleInformation() Para desviar o arquivo de saída especificamente para excluí -lo da herança.

Estou certo de que deve haver uma maneira melhor de herdar As alças específicas que eu quero, sem permitir a herança "cobertor" que passa alças não intencionais e indesejadas. Infelizmente, não consegui encontrar uma solução, tendo navegado o maior número possível de artigos do MSDN relacionados e pesquisando no Google em um estado de desânimo.

No mínimo, eu preciso fazer algo Para remover as alças da criança, sem necessariamente ter essas alças na classe de demonstração (elas são usadas pela classe de chamada, e essa classe de demonstração não tem conhecimento explícito de sua existência).

Alguma soluções para mais herança seletiva? Estou especialmente interessado na solução que me permite declarar especificamente o que lida com o herdar, e todas as alças não especificadas não serão herdadas, se essa solução existir.

Obrigado gentilmente.

Foi útil?

Solução

Se o identificador de arquivo de saída for herdado pelo processo filho, isso ocorre porque o código no processo pai, o arquivo aberto, o arquivo declarou explicitamente que o identificador de arquivo deve ser herdável. Passou um valor para o lpSecurityAttributes parâmetro de CreateFile. O estado padrão é para o identificador para não ser herdável.

Parece-me que sua classe de criação de processos não deve tentar adivinhar seu chamador, que já abriu o arquivo.

No entanto, se você tiver um conhecimento especial de exatamente o que lida com as necessidades do novo processo, a partir do Windows Vista, existe um mecanismo para especificar quais linhas devem ser herdadas. Quando você se prepara para ligar CreateProcess, use um STARTUPINFOEX estrutura em vez do usual STARTUPINFO. Tem um lpAttributeList membro. Alocá -lo e inicialize e depois use UpdateProcThreadAttribute com PROC_THREAD_ATTRIBUTE_HANDLE_LIST Para definir a lista de alças para ser herdada. Todas as alças precisam ser herdáveis, e você ainda precisa especificar bInheritHandles = true quando Você ligar CreateProcess. Você também precisa incluir EXTENDED_STARTUPINFO_PRESENT no dwCreationFlags parâmetro. Raymond Chen demonstrou a técnica em um artigo em 2011.

Se essa funcionalidade adicionada não estiver disponível para você, você certamente poderá tentar [enumerar todas as alças abertas do seu programa] e definir todas as suas propriedades de herança com SetHandleInformation, mas isso parece estar além do escopo de uma função cujo trabalho é criar processos infantis. Deixe o código que cria as alças se preocupe se deveriam ser herdáveis.

Outras dicas

Você pode usar Sethandleinformation para limpar o HANDLE_FLAG_INHERIT Bit no identificador de saída, isso impedirá que o processo filho o herite.

Se esse sinalizador estiver definido, um processo infantil criado com o parâmetro binherithandles do CreateProcess definido como true herdará o identificador do objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top