Jump to content
Hugao

Executar comando shell

Recommended Posts

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

Edited by Hugao
GeSHi

Share this post


Link to post
Share on other sites
thoga31

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


Knowledge is free!

Share this post


Link to post
Share on other 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 ;)

Edited by Hugao

Share this post


Link to post
Share on other 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);).

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
HappyHippyHippo

se queres ter a certeza que os dados do printf sejam apresentados antes do scanf, sim tens


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

Share this post


Link to post
Share on other sites
Hugao

se queres ter a certeza que os dados do printf sejam apresentados antes do scanf, sim tens

ok obrigado ;)

e obrigado a todos que ajudaram

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.