Jump to content

Simular inputs


Leudassdf
 Share

Recommended Posts

Boas pessoa,

eu tenho um programa que vai pedir ao utilizador alguns dados. A estrutura e mais ou menos esta:

void t(){
char opcao;
scanf("%c",&opcao);
//aqui vao estar o resto das instrucoes
}
int main(){
//chama a funcao t
t();
}

Basicamente pede um ou mais valores ao utilizador e depois executa as funcoes de acordo com esse valor.

O que eu necessitava de fazer era criar um outro software que interagi-se com o codigo acima. Ou seja o 2 programa deveria introduzir a opcao. No entanto isto é possivel estando eu a utilizar um scanf?

Cumprimentos

Leandro Rodrigues

Link to comment
Share on other sites

sim é, mas é um bocado complicado ...

o que necessitas de fazer será algo dentro destes moldes:

int main(void) {
 pid_t pid;
 int commpipe[2];
 int i;

 // criar os pipes para comunicação com a aplicação a ser executada
 if(pipe(commpipe)) {
   perror("pipe");
   exit(-1);
 }

 // criar um novo processo
 if((pid = fork()) == -1) {
   perror("fork");
   exit(-1);
 }

 // verificar se é o processo filho
 if (pid == 0) {
   // alterar o stdin pelo primeiro pipe e o stdout pelo segundo pipe
   dup2(commpipe[0], 0);
   dup2(commpipe[1], 1);

   // alterar o ambiente do processo pela aplicação pretendida
   if(execl("my_called_app", "my_called_app", NULL) == -1) {
     perror("execl");
     exit(-1);
   }
 } else {
   // pedir o valor a ser enviado
   printf("Escreva o valor a ser enviado para a aplicacao :");
   fflush(stdout);
   scanf("%d", &i);

   // enviar um valor
   fprintf(commpipe[0], "%d", i);

   // ler um valor escrito pela aplicação
   fscanf(commpipe[1], "%d", &i);
 }

 return 0;
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

sim é, mas é um bocado complicado ...

o que necessitas de fazer será algo dentro destes moldes:

int main(void) {
 pid_t pid;
 int commpipe[2];
 int i;

 // criar os pipes para comunicação com a aplicação a ser executada
 if(pipe(commpipe)) {
perror("pipe");
exit(-1);
 }

 // criar um novo processo
 if((pid = fork()) == -1) {
perror("fork");
exit(-1);
 }

 // verificar se é o processo filho
 if (pid == 0) {
// alterar o stdin pelo primeiro pipe e o stdout pelo segundo pipe
dup2(commpipe[0], 0);
dup2(commpipe[1], 1);

// alterar o ambiente do processo pela aplicação pretendida
if(execl("my_called_app", "my_called_app", NULL) == -1) {
  perror("execl");
  exit(-1);
}
 } else {
// pedir o valor a ser enviado
printf("Escreva o valor a ser enviado para a aplicacao :");
fflush(stdout);
scanf("%d", &i);

// enviar um valor
fprintf(commpipe[0], "%d", i);

// ler um valor escrito pela aplicação
fscanf(commpipe[1], "%d", &i);
 }

 return 0;
}

Boas ,

Eu estive a tentar fazer o que disses-te mas infelizmente nao cnsegui. Dá-me erros de compilacao que ainda nao consegui resolver.

Por coincidencia no dia de ontem o professor comecou a falar do execl mas ainda nao consegui entender o seu funcionamento.

De notar que na aula usamos o SO linux para fazer o execl e o fork. No windows tambem dará para fazer isto?

Eu gostava de fazer um programa para interagir com outro para verificar o comportamento dele com um elevado numero de dados. mas ter que escrever esses dados todos a unha nao é nada facil....

Link to comment
Share on other sites

Eu gostava de fazer um programa para interagir com outro para verificar o comportamento dele com um elevado numero de dados. mas ter que escrever esses dados todos a unha nao é nada facil....

para isso não necessitas de uma segunda aplicação, basta usar funcionalidades da shell para sobrepor o stdin ... exemplo:

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 256

int main(void) {
 char buffer[bUFFER_SIZE];
 int run = 1;

 while (run) {
   if (fgets(buffer, BUFFER_SIZE, stdin)) {
     if (strncmp(buffer, "exit", 4) == 0)
       run = 0;
     else
       printf("%s", buffer);
   }
 }

 return 0;
}

input.txt

mensagem
valor de envio
terceiro input
exit

correr a aplicação

gcc app main.c
app << input.txt

output:

mensagem
valor de envio
terceiro input

No windows tambem dará para fazer isto?

não te responder a isso ... até porque a função está declarada no header unistd.h (Unix Standard).

por isso existe a possibilidade de conseguires com o mingw mas tenho sérias dúvidas

deverá existir outra opção com funcionalidades semelhantes na Win32

----------------------------------------------

PS :

tinha-me esquecido que os pipe são unidireccionais.

necessitas de dois, um para enviar dados do processo pai para o filho e outro do processo filho para o pai.

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

para isso não necessitas de uma segunda aplicação, basta usar funcionalidades da shell para sobrepor o stdin ... exemplo:

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 256

int main(void) {
 char buffer[bUFFER_SIZE];
 int run = 1;

 while (run) {
if (fgets(buffer, BUFFER_SIZE, stdin)) {
  if (strncmp(buffer, "exit", 4) == 0)
	run = 0;
  else
	printf("%s", buffer);
}
 }

 return 0;
}

input.txt

mensagem
valor de envio
terceiro input
exit

correr a aplicação

gcc app main.c
app << input.txt

output:

mensagem
valor de envio
terceiro input

não te responder a isso ... até porque a função está declarada no header unistd.h (Unix Standard).

por isso existe a possibilidade de conseguires com o mingw mas tenho sérias dúvidas

deverá existir outra opção com funcionalidades semelhantes na Win32

----------------------------------------------

PS :

tinha-me esquecido que os pipe são unidireccionais.

necessitas de dois, um para enviar dados do processo pai para o filho e outro do processo filho para o pai.

Boas,

so hoje tive oportunidade para testar. infelizmente nao consegui fazer

gcc app main.c
app << input.txt

No entanto eu queria saber se isso funciona com um scanf.

Isto orque ja tenho o programa feito e com scanf para obter os valores....

Link to comment
Share on other sites

< e > são operadores de redireccionamento I/O (não sei se este é o nome técnico correcto, mas segue a explicação). Quando fazes aplicacao < input, estás a passar o conteúdo de input à aplicação. Desta forma, aplicacao vai considerar que o stdin não é o teclado mas sim input. Neste caso, é um ficheiro *.txt.

Por outro lado, se quiseres que o output de um programa seja guardado algures, usas >. Por exemplo, aplicacao > output.txt vai colocar o output do programa aplicacao no ficheiro output.txt, não sendo escrito no terminal (ecrã). Ou seja, o stdout não é o monitor mas sim o ficheiro.

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.