Ir para o conteúdo
Hugao

Executar comando shell

Mensagens Recomendadas

Hugao

Boas.

Eu agora voltei a trabalhar em C mas desta vez em Linux. Quando era no Windows para chamar uma app externa era usar o system(""); e estava feito. No Linux é igual mas ocorre um pequeno pormenor, em certos comandos se eu tiver um printf antes do system a app executa primeiro o system e só depois o printf, como foi no caso de uma mini app que fiz para iniciar o MariaDB e o Apache2

Como é que resolvo isto?

Também já vi que existem mais maneiras de chamar comandos/apps externas mas não percebi como funcionam :s era o fork (que não executou a app) e o posix_spawn mas não percebi muito bem como ele funcionou.

Podem me ajudar?

Obrigado,

Hugo Rodrigues

Editado por Hugao
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Hugao

A imagem corresponde ao código, não vi onde está o problema.

Sim eu depois também reparei nisso xD dai ter tirado depois. Mas no caso da app para iniciar o Apache e o MariaDB isso acontece.

Por exemplo eu tenho

printf("O resultado e: %.2f",result);
system("read -s");

Ele primeiro fica à espera da tecla e só depois mostra o printf. O mesmo acontece com o sleep()

Experimenta adicionar um fflush(stdout); a seguir ao printf.

Ok vou experimentar ;)

Editado por Hugao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Por questões de optimização, o stdout vai acumulando caracteres num buffer, e só os envia para o ecrã quando encontra um \n. Assim, sempre que tiveres um printf que não termine em \n, para garantires que os dados são logo enviados para o ecrã, precisas de dar uma indicação ao stdout para "despejar" o buffer (o que é feito através da chamada fflush(stdout);).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

só uma pequena nota.

só os envia para o ecrã quando encontra um \n

não tenho a certeza mas estou convicto que é quando é inserido o caracter '\n' ou quando o buffer interno fica cheio

(o tamanho do buffer interno é dependente da implementação, logo impossível de saber sem testar)

uma boa leitura sobre IO em C : http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_7.html

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Hugao

Por questões de optimização, o stdout vai acumulando caracteres num buffer, e só os envia para o ecrã quando encontra um \n. Assim, sempre que tiveres um printf que não termine em \n, para garantires que os dados são logo enviados para o ecrã, precisas de dar uma indicação ao stdout para "despejar" o buffer (o que é feito através da chamada fflush(stdout);).

Deixa ver se percebi, sempre que faço um printf que não acabe em \n tenho que fazer fflush(stdout); depois do printf?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Deixa ver se percebi, sempre que faço um printf que não acabe em \n tenho que fazer fflush(stdout); depois do printf?

não existe nada que te obrigue, mas é aconcelhado


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Hugao

não existe nada que te obrigue, mas é aconcelhado

Mas é aconselhado em todos os printf sem \n no fim? Estou a perguntar se por exemplo tenho printf("qualquer coisa"); scanf("%d",&var); devo de meter o fflush no meio

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.