Leudassdf Posted March 26, 2014 Report Share Posted March 26, 2014 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 More sharing options...
HappyHippyHippo Posted March 26, 2014 Report Share Posted March 26, 2014 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 Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 27, 2014 Author Report Share Posted March 27, 2014 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 More sharing options...
HappyHippyHippo Posted March 27, 2014 Report Share Posted March 27, 2014 (edited) 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 March 27, 2014 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 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 More sharing options...
HappyHippyHippo Posted March 29, 2014 Report Share Posted March 29, 2014 como não conseguiste ? apresentei um exemplo completo !!! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 como não conseguiste ? apresentei um exemplo completo !!! Eu sei. Deixo aqui o link da imagem da minha configuracao. https://app.box.com/s/9sa0x7fbtb04o3wyuu3i Existe alguma coisa mal? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2014 Report Share Posted March 29, 2014 Existe alguma coisa mal? sim, aqui: correr a aplicação gcc app main.c app << input.txt gcc -o app main.c app << input.txt IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 agora ja compilou. No entanto ele quando faco app <<input.txt ele nao faz nada. parece me que fica a espera de alguma coisa. Imagem do que acontece:https://app.box.com/s/7ypf788s86829ljog0q7 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2014 Report Share Posted March 29, 2014 gcc -o app main.c ./app << input.txt IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 gcc -o app main.c ./app << input.txt nao faz qualquer diferenca. So sai do programa quando carrego CTRL-C Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2014 Report Share Posted March 29, 2014 desculpa .. é só um < gcc -o app main.c ./app < input.txt IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 desculpa .. é só um < gcc -o app main.c ./app < input.txt bem agora já funciona. Podes só explicar-me o que faz o app <input.txt? Isto só pode ser feito em linux ou tambem é possivel faze-lo em Windows? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 29, 2014 Report Share Posted March 29, 2014 que eu saiba é uma funcionalidade da consola do linux http://linuxcommand.org/lts0060.php IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
thoga31 Posted March 29, 2014 Report Share Posted March 29, 2014 < 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 More sharing options...
Leudassdf Posted March 29, 2014 Author Report Share Posted March 29, 2014 Entendido. Já agora e possivel chamar o cmd e colocar lá os comandos que deve executar? do genero: system("cmd.exe /c cd C:\\"); //agora deveria executar o programa que esta na pasta teste. Link to comment Share on other sites More sharing options...
Leudassdf Posted March 30, 2014 Author Report Share Posted March 30, 2014 que eu saiba é uma funcionalidade da consola do linux http://linuxcommand.org/lts0060.php Pois eu estive a tentar fazer em windows e consegui. é exatamente a mesma coisa que no linux. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now