Chamar o terminal em Console Application

1. Chamar o terminal em Console Application

Poiel Gonçalves
strule

(usa Fedora)

Enviado em 12/03/2016 - 15:49h

Bom dia a todos, estava entediado na minha casa e resolvi treinar um pouco de C++, criei uma calculadora de console. Terminei, compilei, etc. Tudo foi OK, porém enfrento o problema de que o executável não abre se não for chamado pelo UXTerm ou Konsole, existe alguma linha possivel de ser inserida no código fonte, para não haver a necessidade de abrir o terminal manualmente sempre que quiser usar o app?
Atualmente estou usando o KUbuntu 16.04 Daily e CODE::BLOCKS IDE


  


2. Re: Chamar o terminal em Console Application

Perfil removido
removido

(usa Nenhuma)

Enviado em 13/03/2016 - 06:15h

system("/usr/bin/konsole");

??

Ô Gambiarra!

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: Chamar o terminal em Console Application

Poiel Gonçalves
strule

(usa Fedora)

Enviado em 13/03/2016 - 12:43h


listeiro_037 escreveu:

system("/usr/bin/konsole");


Se eu colocar isso dentro do meu código C++ funciona ou tenho que fazer um código separado?


4. Re: Chamar o terminal em Console Application

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 13/03/2016 - 14:10h

Galera, acho que fiz a maior gambiarra do mundo.

Se servir para alguma coisa, ficarei grato.

Esse código tá entupido de gambiarras, só não precisa ficar jogando na cara rsrsrs.

[O código que tu quer executar em um terminal separado tu coloca depois do if.


#include <iostream>
#include <string>
#include <cstdio>

void pause(){
std::cout << "\n\n--\nPressione enter para continuar...\n";
getchar();
}

int main(int argc, char **argv){

if(!(argc == 2 && std::string(argv[1]) == "execTerm")){

std::string name;
name += "/usr/bin/konsole -e ";
name += std::string(argv[0]) + " ";
name += "execTerm";

int result = system(name.c_str());

return result;

}

std::cout << "Fui executado em um terminal!";

pause();

return 0;
}


No caso, teria de trocar de /usr/bin/konsole para outro caso você não tenha ele instalado [ou apenas instale ele]

Espero ter ajudado

[]'s

T+

--

Att,

Thiago Henrique Hüpner

http://pastebin.com/ZANutRt4


5. Re: Chamar o terminal em Console Application

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/03/2016 - 15:29h

Você pode criar um atalho para o programa, e no atalho informar que o programa em questão precisa de um terminal. Quando o ambiente gráfico vir que está executando tal programa, vai chamar um terminal e executar o programa dentro dele.

Você pode embutir essa inteligência no próprio programa, também. Para tanto, você tenta abrir /dev/tty. Se conseguir, então já tem um terminal associado. Se não, você pode reexecutar o programa dentro de um terminal.

Segue um exemplo (não testado, porém essencialmente correto ou muito próximo disso) de como, mais ou menos, fazer isso.

const char *terminal_search_order[]={
"konsole", // KDE
"gnome-terminal", // Gnome
"xterm", // X11 padrão
"rxvt", // X11 (suportamente mais leve)
NULL // Fim da lista.
};


int main(int argc, char **argv){
int tty_fd=open("/dev/tty", O_RDWR, 0644);
if(tty_fd!=-1){
// Já tem terminal associado. Não faz nada, a não ser fechar o
// descritor usado no teste.
close(tty_fd);
}
else{
// Não temos um terminal. Vamos tentar conseguir um.
if(getenv("DISPLAY")!=NULL){
// Existe (supostamente) um X11. Tenta reexecutar o programa
// dentro de algum dos possíveis terminais gráficos.
char **term_argv;
term_argv=malloc((argc+3)*sizeof *term_argv);
if(term_argv==NULL){
fprintf(stderr, "Falha ao alocar memória: %s.\n", strerror(errno));
exit(1);
}
term_argv[1]="-e"; // Em C++, “const_cast<char *>("-e")”.
for(int n=0; n<=argc; n++)
term_argv[n+2]=argv[n];

// Tenta os vários tipos de terminal.
const char **ppt;
for(ppt=terminal_search_order; *ppt!=NULL; ppt++){
term_argv[0]=(char *)*ppt; // Em C++, “const_cast<char *>(ppt)”.
execvp(term_argv[0], term_argv);
}

// Todos os terminais gráficos falharam. Deixa seguir pelo código
// abaixo, que tenta conseguir terminal de texto.
}

// Tenta conseguir um terminal de texto usando o “screen”.

/*
Se for um programa interativo (i.e. se pedir para ler dados do
terminal, o usuário terá de se conectar ao terminal), chamando
"screen -r", para poder interagir com o programa. Por outro
lado, se o programa não solicitar entrada de dados e terminar
de executar, a sessão do screen também vai terminar, e não
será mais possível ver a saída gerada (a não ser que você
defina um valor para a opção “zombie“ no arquivo de
configuração do screen).
*/
char **term_argv=malloc((argc+4)*sizeof *term_argv);
if(term_argv==NULL){
fprintf(stderr, "Falha ao alocar memória: %s.\n", strerror(errno));
exit(1);
}
term_argv[0]=(char *)"screen";
term_argv[1]=(char *)"-d";
term_argv[2]=(char *)"-m";
for(int n=0; n<=argc; n++)
term_argv[n+3]=argv[n];

execvp(term_argv[0], term_argv);

// Se chegou aqui, falhou a execução dentro do screen.

// Dependendo do programa, pode ser melhor abortar, mas
// eu aqui simplesmente deixo a execução seguir.
}

// Programa prossegue daqui.
// (...)
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts