Estou tendo problemas para entender os tubos e sua implemenização no xv6


1

Estou estudando Sistemas Operacionais por conta própria a partir das palestras do MOOC disponíveis on-line e queria trabalhar no xv6. Eu estava lendo a documentação no xv6 e no capítulo 0, quando se fala em tubos (pág. 13), tenho uma dúvida.

int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;

pipe(p);
if(fork()==0){
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
exec("/bin/wc", argv);
}
else{
write(p[1], "hello world\n", 12);
close(p[0]);
close(p[1]);}

Está escrito que: -
Agora, os dups filhos lêem end no descritor de arquivo 0, fecham fds em p e execs wc. Quando o wc lê a partir de sua entrada padrão, ele lê no canal. O pai grava no final de gravação do canal e fecha os dois descritores de arquivo.

Além disso, é mencionado que os processos não compartilham variáveis, ou seja, as alterações feitas em um processo não refletem no do outro.

Agora, aqui, eu escrevo no processo pai e se o filho chegar ao exec antes que o pai termine de escrever para p [1], o filho aguardará e, depois que terminar de escrever, o filho lerá de p [0] e fará o exec. Então, é correto dizer que existem privilégios especiais para canais, o que os torna compatíveis com a comunicação entre processos compartilhando canais? Assim, diferentemente das variáveis ​​cujas mudanças não refletiriam em outro processo, os pipes são compartilhados e, portanto, suas alterações refletem um no outro?
O raciocínio acima está correto?

Respostas:


1

Seu raciocínio está quase certo. Não é que os tubos tenham privilégios especiais; você está pensando neles como o tipo errado de coisa. Um canal não é uma variável, é um objeto do SO criado no kernel usando a pipechamada do sistema e pode ser aberto em um ou mais processos por vez. Os dados gravados na extremidade gravável de um canal (ou seja, o segundo dos dois descritores de arquivo criados na pipe(p)chamada e armazenados na matriz p) podem ser lidos no outro descritor de arquivo ( p[0]aqui, que é duplicado no descritor de arquivo 0, que é o descritor de arquivo usado para stdin). É possível ler e gravar no canal, independentemente de quais processos têm esses descritores de arquivos abertos.

Você pode perceber que não apenas atribui valores aos tubos; você writepara eles como arquivos (ewriteé uma chamada do sistema; o programa está dizendo ao kernel para fazer alguma coisa, não apenas alterando um valor na memória local). De fato, se você pensa em pipes como arquivos, exceto que eles podem ser anônimos (sem nome), não podem ter descritores de arquivos capazes de ler e escrever (ou seja, são unidirecionais) e apenas retêm dados entre escrita e lendo e não depois que os dados forem lidos ou que todos os descritores de arquivo do canal estejam fechados, você não estará muito errado. Assim como dois processos podem compartilhar o acesso ao mesmo arquivo, dois processos podem compartilhar o acesso a um canal (a maneira mostrada aqui é uma maneira comum de criar um canal para dois processos compartilharem, mas você também pode ter dois processos completamente independentes abertos um "pipe nomeado", que é a mesma ideia, exceto se você der um nome como um arquivo,

A criação manual de pipes geralmente é feita para comunicação entre processos, mas não necessariamente no código-fonte. Além disso, os dois programas não precisam estar em execução ao mesmo tempo. Se você escrever uma linha em um shell usando |(o "caractere de pipe"), estará dizendo ao shell para criar um pipe a partir stdoutdo primeiro comando para stdino segundo comando (assim como o exemplo acima cria um pipe no stdinde /bin/wc) Ou seja, um comando shell como ls | wc) cria um canal com o final gravável definido como descritor de arquivo 1 ( stdout), executa lse, assim, captura sua saída nesse canal, define o final legível como descritor de arquivo 0 ( stdin) e executa wc, que lê devidamente a saída do agora finalizado lse gera o resultado para seu própriostdout, que acaba no seu terminal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.