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

NameException

System call: exec() em C

6 mensagens neste tópico

Boas,

Com qual das system call exec() do C, poderei executar comandos do tipo: /usr/bin/bc (e input: 13+3 ...)?

Já experimentei as system call execvp() e execve(), mas nenhumas delas deu para este tipo de comando. :)

obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A menos que consigas efectuar a operação passando os dados como argumentos, o teu problema não é com o exec, mas com o redireccionamento do input/output.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, é como dizes...

Mas por exemplo, comandos como /bin/ls /etc , ou simplesmente /bin/ls, são executados correctamente. Agora /usr/bin/bc nem sequer dá erro... Continua o programa sem erro!

Terá alguma coisa haver com as variáveis de ambiente passadas em int main(int argc, char *argv[], char *envp[]) { ...}?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Possivelmente o bc precisa de ser invocado através de uma bash, não sei...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Possivelmente o bc precisa de ser invocado através de uma bash, não sei...

Acho que é exactamente isso. Fiz um pequeno código que chama a função popen e o que isto faz basicamente é criar um processo (fork) e abre um pipe invocando a shell com o comando passado num dos argumentos do popen. Depois é só ler do pipe como se de um ficheiro "normal" se tratasse.

#include<stdio.h>

int 
main(void)
{
  FILE *FicheiroPipe;
  char * comando = "/usr/bin/bc -h";
  char linha[256];

  if( !(FicheiroPipe = (FILE*)popen(comando,"r")))
    { /* se FicheiroPipe e' NULL */
      perror("Problemas com o pipe");
      return -1;
    }
  while(fgets(linha, sizeof(linha), FicheiroPipe))
    {
      printf("%s", linha);
    }
  pclose(FicheiroPipe);

  return 0;
}

Foi compilado com

$ gcc -Wall -pedantic -o teste teste.c

Penso que seja por invocar a shell que funciona. Mas assim que tiver mais tempo gostava de saber se é por esta razão ou não que este código funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado mrentes e Rui Carlos.

Mas, mrentes, o que eu preciso é de algo mais dinâmico, ou seja, que não esteja confinado a executar um único comando, mas sim comandos enviados pelo utilizador. Mas só não estou a conseguir executar comandos com input, tal como exemplifiquei acima...

Não me estou a saber explicar? Tens alguma ideia??

Isto de misturar sistemas operativos com redes, é chato... lolol mas aliciante... hehehe

Obrigado

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