Posso canalizar dois processos um para o outro?

8

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 forkum 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?

qdii
fonte
1
Se sua pergunta é realmente sobre um "ancestral comum", não é isso que sua citação diz. Um pai é um ancestral, mas nem todos os ancestrais são pais.
quer
dê uma olhada em ps auxfuma idéia sobre ancestrais do processo.
Michas
@msw, você quer dizer que os 2 processos precisam ter o mesmo pai direto? ser primo (ou seja, ter um avô em comum) não é suficiente?
Qdii

Respostas:

7

Estou certo em pensar que qualquer par de processos pode ser canalizado um para o outro?

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.)

Esteira
fonte
4

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 | rot13envolve as seguintes etapas:

  • A concha cria um cano.
  • O shell bifurca um processo. A criança fecha a extremidade leitura do tubo e chamadas execveon ls.
  • O shell bifurca um processo. A criança fecha a extremidade gravação do tubo e chama execveno rot13.
  • A concha fecha as duas extremidades do tubo e aguarda a saída de ambos os subprocessos.

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.)

Gilles 'SO- parar de ser mau'
fonte
2

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

$ tail -f /etc/motd | tail -f | cat > /dev/null

ps -eaH mostrará que o gato e suas duas caudas são filhos da concha que invoca:

 1675 pts/0    00:00:00     bash
 2483 pts/0    00:00:00       tail
 2484 pts/0    00:00:00       tail
 2485 pts/0    00:00:00       cat
msw
fonte