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