PESSOAL ESTOU TENTANDO RESOLVER UM EXERCICIO EM C MAIS NÃO ESTOU CONSEGUINDO, REALMENTE NÃO ESTÁ FACIL, SERA QUE alguém PODERIA AJUDAR? TAMBEM FICA COMO DESAFIO PARA QUEM CONSEGUIR FAZE-LO:
ENUNCIADO:
desenvolver na linguagem C tres versoes de um programa que execute
operacoes matematicas elementares
as operacoes matematicas são: +,−, , /
um processo, dito cliente, le do teclado uma operacao matematica
envia a operacao a ser relizada, no seguinte formato: “operando
operador operando” (2 + 2)
o outro processo, dito receptor, recebe a descricao da operacao,
executa e envia resposta (4)
o cliente recebe resposta e exibe o resultado na tela
fazer uma versao que usa pipes, outra pipes nomeados e uma terceira memoria
compartilhada
ESTAVA FAZENDO O PRIMEIRO QUE USA SOMENTE PIPE SEGUE O CODIGO ABAIXO, MAIS NÃO ESTOU CONSEGUINDO SUCESSO...
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int n, fd[2];
/* recebe os numeros e a operação, calcula e devolve o resultado*/
void calcula(int n1, int n2, char op, int fd){
char saida[15];
int result;
switch(op){
case '+':
result=n1+n2;
break;
case '-':
result=n1-n2;
break;
case '/':
result=n1/n2;
break;
case '*':
result=n1*n2;
break;
}
/* imprimimos o resultado no fd */
sprintf(saida,"%d",result);
/* agora mandamos os bytes */
if (write(fd, saida, strlen(saida)) != strlen(saida) ) {
fprintf(stderr, "Erro na escrita no pipe (saida=%s)\n",saida);
}
}
int main(int argc, char *argv[]){
int fd[2];
pid_t pid;
int n1,n2,result;
n1=atoi(argv[1]);
n2=atoi(argv[3]);
/* cria pipe */
if (pipe(fd) < 0) {
perror("Problema na criacao do pipe");
exit(1);
}
if ( (pid = fork() ) < 0) {
perror("Problema no fork");
exit(1);
}else if ( pid > 0 ) {
/* pai */
close (fd[0]); /* fecha o lado da leitura */
calcula(n1,n2,*argv[2],fd[1]); /* gera o resultado(saida) escrevendo-a no pipe */
/* terminada a saida, fechamos este lado de writing do pipe */
close(fd[1]);
/* esperamos pela terminacao do filho */
if (waitpid (pid, NULL, 0) < 0) {
fprintf(stderr, "Erro no waitpid");
exit(1);
}
/* pai sai normalmente */
exit(0);
}
else {
/* filho */
close(fd[1]); /* fecha o lado de escrita */
/* queremos chamar dup2 para associar lado de leitura
** do pipe com stdin, mas temos que tomar cuidado para
** o lado do pipe já' ser o proprio stdin. Lembremos
** da definicao de dup2(filedes, filedes2) :
** dup2 causa o file descriptor filedes2 se referir
** a mesma coisa que files. Se filedes2 se refere a
** um file descriptor já' aberto e diferente de filedes,
** então ele e' primeiro fechado.
** Portanto, queremos fechar que stdin seja fechado no
** caso de fd[0] já' ser o stdin. Voce acha que seria
** possivel, ou seja, que fd[0] poderia ser o stdin quando
** criado pelo pipe() ? Bem, e' possivel se o shell não
** criou o fd 0 como sendo o stdin, pois ai' pipe acharia
** que este valor (menor file descriptor não usado) estaria
Pergunta
Guest --JOAO --
PESSOAL ESTOU TENTANDO RESOLVER UM EXERCICIO EM C MAIS NÃO ESTOU CONSEGUINDO, REALMENTE NÃO ESTÁ FACIL, SERA QUE alguém PODERIA AJUDAR? TAMBEM FICA COMO DESAFIO PARA QUEM CONSEGUIR FAZE-LO:
ENUNCIADO:
desenvolver na linguagem C tres versoes de um programa que execute
operacoes matematicas elementares
as operacoes matematicas são: +,−, , /
um processo, dito cliente, le do teclado uma operacao matematica
envia a operacao a ser relizada, no seguinte formato: “operando
operador operando” (2 + 2)
o outro processo, dito receptor, recebe a descricao da operacao,
executa e envia resposta (4)
o cliente recebe resposta e exibe o resultado na tela
fazer uma versao que usa pipes, outra pipes nomeados e uma terceira memoria
compartilhada
ESTAVA FAZENDO O PRIMEIRO QUE USA SOMENTE PIPE SEGUE O CODIGO ABAIXO, MAIS NÃO ESTOU CONSEGUINDO SUCESSO...
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int n, fd[2];
/* recebe os numeros e a operação, calcula e devolve o resultado*/
void calcula(int n1, int n2, char op, int fd){
char saida[15];
int result;
switch(op){
case '+':
result=n1+n2;
break;
case '-':
result=n1-n2;
break;
case '/':
result=n1/n2;
break;
case '*':
result=n1*n2;
break;
}
/* imprimimos o resultado no fd */
sprintf(saida,"%d",result);
/* agora mandamos os bytes */
if (write(fd, saida, strlen(saida)) != strlen(saida) ) {
fprintf(stderr, "Erro na escrita no pipe (saida=%s)\n",saida);
}
}
int main(int argc, char *argv[]){
int fd[2];
pid_t pid;
int n1,n2,result;
n1=atoi(argv[1]);
n2=atoi(argv[3]);
/* cria pipe */
if (pipe(fd) < 0) {
perror("Problema na criacao do pipe");
exit(1);
}
if ( (pid = fork() ) < 0) {
perror("Problema no fork");
exit(1);
}else if ( pid > 0 ) {
/* pai */
close (fd[0]); /* fecha o lado da leitura */
calcula(n1,n2,*argv[2],fd[1]); /* gera o resultado(saida) escrevendo-a no pipe */
/* terminada a saida, fechamos este lado de writing do pipe */
close(fd[1]);
/* esperamos pela terminacao do filho */
if (waitpid (pid, NULL, 0) < 0) {
fprintf(stderr, "Erro no waitpid");
exit(1);
}
/* pai sai normalmente */
exit(0);
}
else {
/* filho */
close(fd[1]); /* fecha o lado de escrita */
/* queremos chamar dup2 para associar lado de leitura
** do pipe com stdin, mas temos que tomar cuidado para
** o lado do pipe já' ser o proprio stdin. Lembremos
** da definicao de dup2(filedes, filedes2) :
** dup2 causa o file descriptor filedes2 se referir
** a mesma coisa que files. Se filedes2 se refere a
** um file descriptor já' aberto e diferente de filedes,
** então ele e' primeiro fechado.
** Portanto, queremos fechar que stdin seja fechado no
** caso de fd[0] já' ser o stdin. Voce acha que seria
** possivel, ou seja, que fd[0] poderia ser o stdin quando
** criado pelo pipe() ? Bem, e' possivel se o shell não
** criou o fd 0 como sendo o stdin, pois ai' pipe acharia
** que este valor (menor file descriptor não usado) estaria
** livre. Mas deveria ser improvavel ...
*/
if (fd[0] != STDIN_FILENO) {
/* diferentes, então podemos chamar sem perigo */
if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) {
fprintf(stderr, "dup2 error para stdin");
exit(1);
}
close(fd[0]); /* não e' necessario mais */
}
}
Link para o comentário
Compartilhar em outros sites
26 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.