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
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
struleusa Fedora
Post recolhido
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
Thihupusa Manjaro Linux
Post recolhido
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.
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.
}