You are on page 1of 3

1) O que faz o seguinte codigo?

Quantos processos sao criados (para alem


do proprio)?
int main(int argc, char * argv[])
{
int i;
for(i^=1; i< argc; i++ )
if(fork() == 0)
{
execl(argv[i], argv[i], (char *)NULL);
perror("Erro exec:");
_exit(-1);
}
R: Cria o numero de processos igual ao numero de argumentos.Ou seja, cria
varios processos, depois esses processos sao executados como os proprios progamas ditos pelos
argumentos.
2)
int main(int argc, char *argv[])
{
int i, p[2], size; total=0;
char buffer(MAXSIZE);
if(pipe(p)==1)
{
perror("erro em pipe()");
exit(saida);
}
else
{

switch (fork ())


{
case -1:
perror ("Error fork: );
_exit (-1);
break;
case 0 :
for( i = 1; i< argc ; i++ )
{
GetFile(argv[i], buffer);

//L de um ficheiro para o buffer

size = strlen(buffer);
write (p[1], &size, sizeof(int) );
write (p[1], buffer, strlen(buffer) );
}
size = 0;
write (p[1], &size, sizeof(int) );
break;
default :
do
{
read (p[0], &size, sizeof(int));
read (p[0], buffer, size);
for( i= 0, i< size ; i++)
if (isdigit (buffer[i])
total ++;
} while (size != 0);

printf( " total = %d\n", total);


}
}
}
2) Considerando o codigo apresentado anteriormente, explique o seu funcionamento. Indique
tambem que operacoes faltam realizar antes do switch.
Ele primeiro le um ficheiro, cria uma string com o tamanho do numero de argumentos,
escreve na string, percorre a string e conta os digitos contidos na string. Por ltimo apresenta o
total de dgitos contidos na string.
3) Descreva que alteracoes efetuaria para utilizar memoria partilhada na implementacao da
pergunta anterior.Nao eh necessario escrever codigo.
No exercicio exemplificado, o metodo de comunicacao entre ficheiros usado eh por pipes e, que
usando a memoria partilhada, comunicamos entre processos atraves de blocos de memoria
separados, ou seja, em vez de armazenar nos buffers das pipes, armazenamos em blocos de
memria que depois serao partilhados entre processos (pai e filho).