Em desta página a partir a concepção e implementação do sistema operacional 4.4BSD , diz-se que:
Uma grande diferença entre tubos e soquetes é que os tubos requerem um processo pai comum para configurar o canal de comunicação
No entanto, se eu gravar corretamente, a única maneira de criar um novo processo é para fork
um existente. Então, eu realmente não consigo ver como dois processos não poderiam ter um ancestral comum. Estou certo em pensar que qualquer par de processos pode ser canalizado um para o outro?
ps auxf
uma idéia sobre ancestrais do processo.Respostas:
Na verdade não.
Os tubos precisam ser configurados pelo processo pai antes que o filho ou os filhos sejam bifurcados. Uma vez que o processo filho é bifurcado, seus descritores de arquivo não podem ser manipulados "de fora" (ignorando coisas como depuradores), o pai (ou qualquer outro processo) não pode fazer a parte "configurar as comunicações. Canal" após o fato .
Portanto, se você usar dois processos aleatórios que já estão em execução, não poderá configurar um canal entre eles diretamente. Você precisa usar alguma forma de soquete (ou outro mecanismo IPC) para que eles se comuniquem. (Mas observe que alguns sistemas operacionais, incluindo o FreeBSD, permitem enviar descritores de arquivo nos soquetes do domínio Unix.)
fonte
Essa frase não é muito clara. Primeiro, os pais devem ser ancestrais , pois o processo de instalação do pipe pode ser um pai, um avô, um bisavô, um avô ou um dos processos de comunicação. Segundo, a frase não significa "se você deseja um canal, deve existir um processo ancestral comum", mas "se você deseja um canal, um processo ancestral comum deve configurá-lo".
Sob o capô, um processo estabelece um tubo consigo mesmo. O canal é um descritor de arquivo como outro qualquer, ou mais precisamente um par de descritores de arquivo, um para cada extremidade. O processo que criou o canal pode usá-lo imediatamente para enviar dados para si mesmo, embora isso raramente seja útil (embora um canal próprio tenha seu uso).
Um idioma típico é para um processo de configuração de um tubo, bifurcar um processo filho e fechar uma extremidade do tubo no pai e a outra extremidade do tubo no filho. Isso permite que o processo pai e filho se comunique em uma direção. Se os processos precisarem de comunicação bidirecional, eles precisarão de dois canais (exceto em algumas variantes unix onde os canais são bidirecionais).
Os tubos são herdados por vez por quaisquer filhos, portanto, o processo que criou o tubo pode não estar envolvido na comunicação. Por exemplo, um canal em um shell criado entre dois comandos externos, como
ls | rot13
envolve as seguintes etapas:execve
onls
.execve
norot13
.Se dois processos existentes quiserem se comunicar, eles poderão usar um canal nomeado . (Bem, também há a descrição do arquivo passando , mas não é para os fracos de coração.)
fonte
O shell do pipeline é o pai comum que configura um canal de comunicação entre os vários membros do pipeline.
Qualquer processo pode ser canalizado para qualquer outro. Os únicos processos que podem ser utilmente canalizados juntos são "filtros" que lêem de stdin e gravam em stdout.
Por exemplo, se você emitir o comando
ps -eaH
mostrará que o gato e suas duas caudas são filhos da concha que invoca:fonte