• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

saramgsilva

Problema ao enviar dados para shell e executar um *.exe

8 mensagens neste tópico

Boas,

é o seguinte eu tenho andado a tentar implementar o seguinte: (é para outro fim mas quero aprender a fazer o básico )

tenho uma pagina com um form e a respectiva textarea onde vou inserir um valor, e primo o botão somar, ao primir, um outro ficheiro de php, vai mandar o valor inserido para a shell e depois manda executar um programa que tenho em C, que consiste em ler 1 numero e somar o numero com 4, sim muito simples....

O programa executa, e recebo o resultado, o problema está é que não consigo fazer com que o exe receba o valor que mando.... não percebo porque... já tentei várias coisas que ja nem sei as quantas ando...

Deixo aqui o meu codigo, para me poderem dar uma ajuda  :dontgetit:

indextofas.html


<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>

executatofas.php

<? 


$numero=$_POST['numero'];

echo $numero;

// para enviar para a Shell 
$e = escapeshellcmd($numero);


// para mandar executar 
$ret= shell_exec("soma");
echo $ret;


?>

e deixo em anexo o exe que estou a usar e o respectivo codigo.....

obrigada

tofas  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu nunca fiz algo do genero mas vou tentar dar uma ajudinha.

Tu estas a chamar o programa em c atraves do

$ret= shell_exec("soma");

Mas onde é que o programa recebe o

scanf("%d",&a);

é no

$e = escapeshellcmd($numero);?????

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja me disseram qual era 1 dos problemas:

no programa em C, tenho que fazer: int main (int argc, char * argv[] ){ ..... }

e eu estava a fazer int main(){ ....}

e depois no php tambem estou a fazer algo mal, ja ainda nao vi o que era...tenho que ver...

$e = escapeshellcmd($numero); 

-> para mandar o valor para a shell...

$ret= shell_exec("soma");

  acho que falta aqui algo....  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fico perplexo com a qualidade de coding em c

no programa em C, tenho que fazer: int main (int argc, char * argv[] ){ ..... }

e eu estava a fazer int main(){ ....}

nao necessariamente

ate podia fazer:

int main (int conchina1, char **painatal2) {

...

}

O que realmente importa saber é que a primeira variavel recebe o numero de argumento e devera ser declarada como um inteiro, a segunda var recebe ou aponta para os argumentos passados.

Os nomes que das as variaveis é indiferente!

Por convençao costuma-se dar argc (argument counter) e argv.

Já agora é de referir que ainda pode ser usado outra variavel para armazenar o ambiente.

Comando env em unix.

ficaria algo do genero

int main(int argc,char *argv[],char *env[])

Ou entao podes trata-lo com apontador, isso ja depende do que precisas.

Quanto ao PHP teras que enviar alem do nome do programa tb os argumentos!

Nao me parece que estejas a fazer isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consegui sacar o rar anexo (como não consigo sacar nenhum ficheiro anexo neste fórum  ;)), por isso não sei o que lá fizeste e vou falar às cegas.

no ficheiro php:

$e = escapeshellcmd($numero);

Esta linha "só" serve para segurança; o que faz é retornar uma string que seja segura para passar ao sistema operativo, isto é, que não permita executar outros comandos ao executar o "outro" programa. Ou seja, essa linha não envia absolutamente nada para lado nenhum. Para enviares o valor para o teu programa, tens que incluir o $e em:

$ret= shell_exec("soma $e");

É aqui que entram os argumentos da função main: argc e argv, que como já foi dito só têm esses nomes por convenção, e podem ser substituídos por quaisquer outros. Já agora, argv significa "argument values" ou "arguments vector", conforme o gosto.

Ao fazeres shell_exec("soma $e"), argc ficará com o valor 2 (o nome do programa também é um argumento), e o array argv ficará com "soma" no índice 0, e o valor de $e no índice 1. Se tivesses mais argumentos, iriam para as posições seguintes do argv, e argc tambem seria incrementado (obviamente ::P)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

TheDark  pois...estava a fazer asneiras...mas ainda não consigo  ;)

index.php

<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>
  </form>

executa.php


<? 


$numero=$_POST['numero'];


echo $numero;


$ret= shell_exec("soma $numero");
echo $ret;


?>

código C : somar.c

#include<stdio.h>


int main(int argc, char * argv[] )
{
     int a=0;
     int soma;
 a=argc;
     printf("Escreva dois inteiros 'a' -- > \n");
     // scanf("%d",&a);  removi isto... :/
     soma=a+4;
     printf(" -- A soma=%d\n",soma);
     
return 0;                       
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ai meu deus

se lesses o meu post

argc (argument counter) simplesmente tem o numero de argumentos passados

os argumentos em si estao contidos no argv, o que te interessa neste caso esta no argv[1]

mas atencao é uma string nao podes simplesmente fazer a=argv[1]; !!!

usa a atoi para converter para um inteiro

gosto da tua assinatura 'imagem' Pascal C HTML SQL JAVA C++ PHP, se fosse a ti acrescentava a C e C++ (muito básico)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ai meu deus

se lesses o meu post

Tinha lido...mas na hora de implementar não li outra vez e por isso fiz asneiras... Até mesmo o TheDark disse o mesmo, mas pensei mal quando tentei resolver....  :-[  :confused:

argc (argument counter) simplesmente tem o numero de argumentos passados

os argumentos em si estao contidos no argv, o que te interessa neste caso esta no argv[1]

mas atencao é uma string nao podes simplesmente fazer a=argv[1]; !!!

usa a atoi para converter para um inteiro

já corri e já implementei... e já funciona!!!!  :P

Solução:

index.php

<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>
  </form>

executa.php


<? 


$numero=$_POST['numero'];


echo $numero;


$ret= shell_exec("soma $numero");
echo $ret;


?>

código C : somar.c

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

int main(int argc, char * argv[] )
{
     int a=0;
     int soma;


 a=atoi(argv[1]);

     printf("Escreva dois inteiros 'a' -- > \n");
     // scanf("%d",&a);  removi isto... :/
     soma=a+4;
     printf(" -- A soma=%d\n",soma);
     
return 0;                       
}
     
}

E já percebi como funciona!!  ;)

Para acabar o meu post:

gosto da tua assinatura 'imagem' Pascal C HTML SQL JAVA C++ PHP, se fosse a ti acrescentava a C e C++ (muito básico)

Quando tiveres comentários destes, peço te que me mandes mensagem privada! Pois não gostei nada de ler o que escreveste...

É triste comentários do género.... e olha nem comento mais porque coisa destas... nem merecem comentário...  :nono1:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora