Escolar Documentos
Profissional Documentos
Cultura Documentos
Canal de comunicação
Arquitectura da comunicação
Modelos de comunicação
Sistemas Operativos 1
Necessidade da Comunicação
Sistemas Operativos 2
Page 1
Departamento de Engenharia Informática
Produtor Consumidor
Sistemas Operativos 3
Sistemas Operativos 4
Page 2
Departamento de Engenharia Informática
Processo Processo
Produtor Mensagem
Consumidor
Enviar Receber
Canal de Comunicação
Sistemas Operativos 5
Exemplos
Sistemas Operativos 6
Page 3
Departamento de Engenharia Informática
Sistemas Operativos 7
Sistemas Operativos 8
Page 4
Departamento de Engenharia Informática
Espaço de endereçamento
do processo P2
Espaço de endereçamento
do processo P1
Sistemas Operativos 9
Sistemas Operativos 10
Page 5
Departamento de Engenharia Informática
Comparação
Sistemas Operativos 11
Memória Partilhada
Sistemas Operativos 12
Page 6
Departamento de Engenharia Informática
• IdCanal = CriarCanal(Nome)
• IdCanal = AssociarCanal (Nome)
• EliminarCanal (IdCanal)
• Enviar (IdCanal, Mensagem, Tamanho)
• Receber (IdCanal, *Buffer, TamanhoMax)
Sistemas Operativos 13
Sistemas Operativos 14
Page 7
Departamento de Engenharia Informática
Sistemas Operativos 15
Processo Processo
Produtor Mensagem
Consumidor
Enviar Receber
Canal de Comunicação
Sistemas Operativos 17
Page 8
Departamento de Engenharia Informática
Características do Canal
Ligação
Sistemas Operativos 19
Page 9
Departamento de Engenharia Informática
Sistemas Operativos 20
Sistemas Operativos 21
Page 10
Departamento de Engenharia Informática
Sincronização
Sistemas Operativos 22
Sistemas Operativos 23
Page 11
Departamento de Engenharia Informática
• Formato
– Opacas para o sistema - simples sequência de octetos
– Estruturada - formatação imposta pelo sistema
Sistemas Operativos 24
Direccionalidade da comunicação
Sistemas Operativos 25
Page 12
Departamento de Engenharia Informática
Modelos de Comunicação
Sistemas Operativos 27
Comunicação Mestre-Escravo
3
4
• Etapas:
– 1 - informação para o processo escravo
– 2 - assinalar ao escravo a existência de informação para tratar
– 3 - leitura e eventualmente escrita de informação para o processo mestre
– 4 - assinalar ao mestre o final da operação
Sistemas Operativos 30
Page 13
Departamento de Engenharia Informática
Difusão da Informação
Processo
Receptor
Processo
Receptor
Processo Informação
Emissor
Processo
Receptor
Processo
Receptor
Sistemas Operativos 32
Sistemas Operativos 33
Page 14
Departamento de Engenharia Informática
cliente servidor
#define NMax 10
#define NMAX 10
#define NCNome 64
typedef char TMensagem[NMax];
IdCC CCliente, CServidor;
typedef char TMensagem[NMAX];
TMensagem Mens;
typedef char Nome[NCNome];
IdCC CResposta, CServidor;
/* Cria a mensagem de pedido do serviço o qual
TMensagem Mens;
contém o identificador da caixa de correio de resposta */
Nome NomeCliente;
void PreencheMensagem(TMensagem MS) { }
/* Trata a mensagem e devolve o nome da caixa de
/* Processa a mensagem de resposta */
correio do cliente enviada na mensagem inicial */
void ProcessaResposta(TMensagem MS) { }
void TrataMensagem (TMensagem Ms, Nome NomeCliente) { }
void main() {
void main () {
CCliente=CriarCorreio("Cliente");
Cservidor=CriarCorreio("Servidor");
CServidor=AssociarCorreio("Servidor");
for (;;) {
for (;;) {
Receber (Cservidor, Mens);
PreencheMensagem (Mens);
TrataMensagem (Mens, NomeCliente);
Enviar (CServidor, Mens);
CResposta=AssociarCCorreio (NomeCliente);
Receber (CCliente, Mens);
Enviar (CResposta, Mens);
ProcessaReposta (Mens);
EliminarCC(CResposta);
}
}
}
}
Sistemas Operativos 34
• É estabelecido um canal de
comunicação entre o Processo
processo cliente e o servidor Pedidos
de ligação
servidor
Processo
Processo servidor
• O servidor pode ter uma cliente dedicado
Sistemas Operativos 35
Canal de diálogo
Page 15
Departamento de Engenharia Informática
Diálogo
Servidor
– Primitiva para Criação de Canal
IdCanal = CriarCanal (Nome);
– Primitivas para Aceitar/Desligar/Eliminar Ligações
IdCanal= AceitarLigacao (IdCanServidor);
Desligar (IdCanal);
Eliminar (Nome);
Cliente
– Primitivas par Associar/Desligar ao Canal
IdCanal:= PedirLigacao (Nome);
Desligar (IdCanal);
Sistemas Operativos 36
Cliente Servidor
IdCanal Canal;
int Ligado;
IdCanal CanalServidor, CanalDialogo;
void main() {
while (TRUE) { void main() {
Canal=PedirLigacao("Servidor"); CanalPedido=CriarCanal("Servidor");
Ligado = TRUE;
for (;;) {
while (Ligado) { CanalDialogo=AceitarLigacao(CanalPedido);
ProduzInformacao(Mens); CriarProcesso(TrataServico, CanalDialogo);
Enviar(Canal, Mens); }
Receber(Canal, Mens); }
TratarInformacao(Mens);
}
TerminarLigacao(Canal);
}
exit(0);
}
Sistemas Operativos 37
Page 16
Departamento de Engenharia Informática
Muitos-para-muitos
Sistemas Operativos 38
pipes
sockets
IPC sistema V
Sistemas Operativos 39
Page 17
Departamento de Engenharia Informática
IPC no UNIX
• Mecanismo inicial:
– pipes
• Extensão dos pipes:
– pipes com nome
• Evolução do Unix BSD 4.2:
– sockets
• Unix sistema V:
– regiões de memória partilhada
– semáforos
– caixas de correio
Sistemas Operativos 44
Processo Processo
Produtor Mensagem
Consumidor
Enviar Receber
Canal de Comunicação
Sistemas Operativos 45
Page 18
Departamento de Engenharia Informática
Pipes
sistema operativo
pipe
Sistemas Operativos 46
Pipes (2)
Sistemas Operativos 47
Page 19
Departamento de Engenharia Informática
Pipes (4)
Processo Utilizador
read fds
write fds
pipe
Sistemas Operativos 49
Comunicação pai-filho
#include <stdio.h> }
#include <fnctl.h> else {
/* processo pai */
#define TAMSG 100 close(fds[0]);
char msg[] = “mensagem de teste”; /* escreve no pipe */
char tmp[TAMSG]; write (fds[1], msg, sizeof (msg));
pid_filho = wait();
main() { }
}
int fds[2], pid_filho;
Sistemas Operativos 50
Page 20
Departamento de Engenharia Informática
Redirecção de Entradas/saídas
Sistemas Operativos 51
exemplo:
who | sort | lpr
read fds
sistema operativo
pipe 1 pipe 2
Sistemas Operativos 52
Page 21
Departamento de Engenharia Informática
NAME
dup - duplicate an open file descriptor
SYNOPSIS
#include <unistd.h>
int dup(int fildes);
DESCRIPTION
The dup() function returns a new file descriptor having the following in common with the original open file
descriptor fildes:
- same open file (or pipe)
- same file pointer (that is, both file descriptors share one file pointer)
- same access mode (read, write or read/write)
The new file descriptor is set to remain open across exec functions (see fcntl(2)).
The file descriptor returned is the lowest one available.
The dup(fildes) function call is equivalent to: fcntl(fildes, F_DUPFD, 0)
Sistemas Operativos 53
pai filho
stdin stdin
stdout stdout close (0)
dup (fds[0]);
close (1); stderr stderr close (fds[0]);
dup (fds[1]);
close (fds[0]); fd[0] fd[0] close (fds[1]);
read (0, ...);
close (fds[1]);
fd[1] fd[1]
write (1, ...);
Sistemas Operativos 54
Page 22
Departamento de Engenharia Informática
Redireccionamento de Entradas/Saídas
exemplo:
who | sort | lpr
read fds
sistema operativo
pipe 1 pipe 2
Sistemas Operativos 56
Page 23
Departamento de Engenharia Informática
popen
NAME
popen, pclose - initiate a pipe to or from a process
SYNOPSIS
#include <stdio.h> TPC
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
DESCRIPTION
The popen() function creates a pipe between the calling program and the command to be executed. The arguments
to popen() are pointers to null-terminated strings. The command argument consists of a shell command line.
The mode argument is an I/O mode, either r for reading or w for writing. The value returned is a stream pointer such
that one can write to the standard input of the command, if the I/O mode is w, by writing to the file stream (see
intro(3)); and one can read from the standard output of the command, if the I/O mode is r, by reading from the file
stream. Because open files are shared, a type r command may be used as an input filter and a type w as an output
filter.
The environment of the executed command will be as if a child process were created within the popen() call
using fork(). The child is invoked with the call: execl("/usr/bin/ksh", "ksh", "-c", command, (char *)0); otherwise,
the child is invoked with the call:
A stream opened by popen() should be closed by pclose(), which closes the pipe, and waits for the associated
process to terminate and returns the termination status of the process running the command language interpreter.
Sistemas Operativos 57
popen (1)
EXAMPLE
The following program will print on the standard output (see
stdio(3S)) the names of files in the current
directory with a .c suffix.
#include <stdio.h>
#include <stdlib.h>
main() {
char *cmd = "/usr/bin/ls *.c";
char buf[BUFSIZ];
FILE *ptr;
Sistemas Operativos 58
Page 24
Departamento de Engenharia Informática
popen (2)
#include <stdio.h>
#define READ 0
#define WRITE 1
#define tst (a,b) (mode == READ ? (b) : (a))
static int popen_pid;
mode = READ mode =WRITE
FILE *popen (char* cmd, int mode) {
int p[2];
if (pipe(p) < 0) return (NULL);
if ((popen_pid = fork()) == 0) }
close ( tst (p[WRITE], p[READ])); ----------------- close ( p[0]); ------------------------ close (p[1]);
close ( tst (0, 1)); ----------------------------------------- close (1); ------------------------------ close (0); o filho lê o que
dup ( tst (p[READ], p[WRITE])); ------------------- dup (p[1]); --------------------------- dup (p[0]); ----------
close ( tst (p[READ], p[WRITE])); ------------------ close (p[1]); -------------------------- close (p[0]);
o pai envia
execl (“/bin/sh”, “sh”, “-c”, cmd, 0);
exit (1);
}
if (popen_pid == -1) return (NULL);
close ( tst (p[READ], p[WRITE])); --------------------- close (p[1]); ---------------------------- close (p[0]);
return ( tst (p[WRITE], p[READ])); ------------------ return (p[0]); ------------------------- return (p[1]); ------- o pai envia
}
para o filho
os argumentos
Sistemas Operativos do comando
59
Page 25
Departamento de Engenharia Informática
Named Pipes
Sistemas Operativos 62
Page 26
Departamento de Engenharia Informática
Sockets
Sistemas Operativos 64
Sistemas Operativos 65
Page 27
Departamento de Engenharia Informática
SOCK_RAW - IP SIM
SOCK_SEQPACKET - - SPP
Sistemas Operativos 66
Page 28
Departamento de Engenharia Informática
• Criação de um socket:
#include <sys/types.h>
#include <sys/socket.h>
int socket (int dominio, int tipo, int protocolo);
Sistemas Operativos 68
Sistemas Operativos 69
Page 29
Departamento de Engenharia Informática
Servidor Cliente
socket socket
bind bind
sendto
recvfrom
sendto
recvfrom
Sistemas Operativos 70
Sistemas Operativos 71
Page 30
Departamento de Engenharia Informática
Sistemas Operativos 72
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path, UNIXDG_PATH);
servlen=sizeof(serv_addr.sun_family) +
strlen(serv_addr.sun_path);
close(sockfd);
unlink(cli_addr.sun_path);
exit(0);
}
Sistemas Operativos 73
Page 31
Departamento de Engenharia Informática
#include <sys/types.h>
#include <sys/socket.h>
Sistemas Operativos 74
Page 32
Departamento de Engenharia Informática
unlink(UNIXDG_PATH);
/* Limpeza preventiva*/
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path, UNIXDG_PATH);
servlen = sizeof(serv_addr.sun_family) + strlen(serv_addr.sun_path);
/* Associa o socket ao nome */
if (bind(sockfd, (struct sockaddr *) &serv_addr, servlen) < 0)
err_dump("server: can't bind local address");
Sistemas Operativos 77
Page 33
Departamento de Engenharia Informática
Servidor Cliente
socket
bind
listen socket
accept connect
read write
write read
Sistemas Operativos 78
Sistemas Operativos 79
Page 34
Departamento de Engenharia Informática
unix.h e inet.h
inet.h
unix.h
#include <stdio.h>
#include <stdio.h> #include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <netdb.h>
#include <arpa/inet.h>
#define UNIXSTR_PATH
"/tmp/s.unixstr"
#define UNIXDG_PATH #define SERV_UDP_PORT 6600
"/tmp/s.unixdgx" #define SERV_TCP_PORT 6601
#define UNIXDG_TMP #define SERV_HOST_ADDR "193.136.128.20“
"/tmp/dgXXXXXXX"
/* endereço do servidor */
#define SERV_HOSTNAME "mega"
/* nome do servidor */
Sistemas Operativos 80
Exemplo
• Servidor de eco
• Sockets no domínio Unix
• Sockets com ligação
Sistemas Operativos 81
Page 35
Departamento de Engenharia Informática
Sistemas Operativos 82
Page 36
Departamento de Engenharia Informática
Sistemas Operativos 84
main(void) {
int sockfd, newsockfd, clilen, childpid, servlen;
struct sockaddr_un cli_addr, serv_addr;
listen(sockfd, 5);
Sistemas Operativos 85
Page 37
Departamento de Engenharia Informática
for (;;) {
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0) err_dump("server: accept error");
str_echo(int sockfd)
{
int n;
char line[MAXLINE];
for (;;) {
/* Lê uma linha do socket */
n = readline(sockfd, line, MAXLINE);
if (n == 0) return;
else if (n < 0) err_dump("str_echo: readline error");
Sistemas Operativos 87
Page 38
Departamento de Engenharia Informática
#include <sys/select.h>
#include <sys/time.h>
int select (int maxfd, fd_set* leitura, fd_set*
escrita, fd_set* excepcao, struct timeval*
alarme)
select:
– espera por um evento
– bloqueia o processo até que um descritor tenha um evento associado ou
expire o alarme
– especifica um conjunto de descritores onde espera:
• receber mensagens
• receber notificações de mensagens enviadas (envios síncronos)
• receber notificações de acontecimentos excepcionais
Sistemas Operativos 88
Select
Sistemas Operativos 89
Page 39
Departamento de Engenharia Informática
struct timeval {
long tv_sec; /* seconds /*
long tv_usec; /* microseconds /*
}
• esperar para sempre → parâmetro efectivo é null pointer)
• esperar um intervalo de tempo fixo → parâmetro com o tempo respectivo
• não esperar → parâmetro com o valor zero nos segundos e microsegundos
Sistemas Operativos 90
Manipulação do fd_set
– fd_set* leitura
– fd_set* escrita
– fd_set* excepcao
Sistemas Operativos 91
Page 40
Departamento de Engenharia Informática
Sistemas Operativos 93
Page 41
Departamento de Engenharia Informática
for(;;) {
mask = testmask;
Page 42