PHP: como manter a E / S acessível no pai após a conclusão do filho do pcntl_fork ()?

0

Estou usando PHP e pcntl_fork (). A ideia é que o pai se bifurque e faça uma pausa para a criança completar; a criança faz uma tarefa e termina; o pai pode verificar o código de retorno da tarefa ou o status do processo filho e continuar de acordo.

(A tarefa é isolada do pai principal por bifurcação, para garantir que o pai possa limpar bem se a tarefa atingir um problema de tempo de execução não intercambiável, como arquivos "include" corrompidos ou bibliotecas de chaves ausentes, daí o fork, basicamente estou implementando isolamento de processo simples para a rara e rara ocasião em que uma condição improvavel pode causar um problema)

Então o problema é que depois de pcntl_fork () ambos os processos compartilham os mesmos descritores de E / S STDXXX, assim que o filho termina sua tarefa, a E / S que está usando é fechada como de costume, e então eles são fechados para o pai também, o que significa que coisas como echo () usadas para continuar interações pelo pai, de repente param de funcionar também.

Estou seguindo uma dica no php.net e usando posix kill -9 no filho em vez de sair, para que o filho termine sem fechar o IO compartilhado com (e necessário) o pai, mas existe uma maneira mais simples fazer isso?

Obrigado!

    
por Stilez 27.07.2015 / 06:09

1 resposta

0

Antes do pcntl_fork() , você pode "enganar" o arquivo de descritores de arquivos desejados abrindo, por exemplo, php://stdout e php://stderr , ou php://fd/3 . Vejo php protocolos .

Observe que quando um filho fecha um descritor de arquivo, ele não é fechado no pai. Depois de uma bifurcação, os processos compartilham o mesmo ponteiro para abrir arquivos, mas você ainda pode fazer eco a partir do pai após a saída do filho.

    
por 27.07.2015 / 14:40

Tags