> For the complete documentation index, see [llms.txt](https://web101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://web101.leandronsp.com/comunicacao-entre-processos.md).

# Comunicação entre processos

Uma vez que entendemos como os computadores evoluíram para um modelo onde **múltiplos programas podem ser executados de forma concorrente,** e que a principal unidade de concorrência em um sistema operacional é o **processo**, como podemos fazer dois processos independentes comunicarem entre si? &#x20;

Afinal, um processo isolado que não conversa com outros processos não serve para muita coisa...

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FCP5L9HxLiHRGqkiuR2BY%2Fipc.jpeg?alt=media&amp;token=0c7124da-3f04-427d-818d-7c8921c847d9" alt=""><figcaption></figcaption></figure>

Pelo motivo de serem isolados e terem seu próprio espaço em memória, para comunicação processos precisam compartilhar um *canal de comunicação*, ou **communication channel.**

É onde entramos então num conceito muito importante chamado *Inter-process communication*, ou **IPC**.

## IPC

Existem diversas formas de IPC, mas vamos destacar *algumas* delas, que serão abordadas neste guia.

* File descriptors
* UNIX Pipes
* UNIX Sockets

Antes de entrarmos em detalhe sobre cada uma das **formas de comunicação** acima, vamos entender como um computador armazena dados *persistentes de longa duração*.&#x20;

### Como os dados persistentes são armazenados

Sabemos que o computador possui uma *memória de trabalho* onde diferentes programas podem utilizá-la durante suas execuções. Mas esta memória é volátil e não serve para armazenar dados de longa duração.

Então, utilizamos outro dispositivo físico para isto, que geralmente é chamado de **HDD** (Hard disk drive), ou simplesmente **HD**. Ou então, os mais modernos **SSD**. Independente do dispositivo I/O, o sistema operacional utiliza um sistema de persistência e busca baseado em *intervalos*, ou ranges.&#x20;

Como conseguimos aceder a uma informação no dispositivo? Em termos físicos, o sistema operacional precisa saber o intervalo entre o começo da informação e seu término. A este intervalo, damos o nome de **file,** ou *arquivo*.

Se agruparmos todos os *arquivos/files* do sistema operacional em um sistema composto por dicionários, temos o que é chamado de **filesystem**.

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FaTplU0HGOPJpkJ1DCfFi%2Ffilesystem.png?alt=media&amp;token=d9e82c7f-5507-47c4-b76c-6d7bac70857f" alt=""><figcaption></figcaption></figure>

Sabendo que cada processo é isolado na memória de trabalho, não nos resta outra chance para fazer ***IPC*** a não ser utilizando o *filesystem*.&#x20;

Vamos então, explorar diferentes formas de IPC, começando por **file descriptors**.
