PDA

View Full Version : Ancora su programmazione UNIX / C


Fire Fox II
21-09-2004, 19:38
Salve raga :)

allora, compilando questo prog

#include <unistd.h>

int main (void)
{
printf("Prima frase\n");
execlp("echo", "echo", "Seconda frase", NULL);
exit(0); }

e provando a dare 2 output "diversi" (in pratica una volta a schermo, ed una volta in un file txt) ottengo 2 risultati diversi...

A schermo mi visualizza

Prima frase
Seconda frase

mentre nel file txt viene memorizzato solo

Seconda frase

nonostante la printf abbia lo "\n" che dovrebbe rimandare a capo...

Perchè? :what:

Thanks for help :)

Fire Fox II
22-09-2004, 10:52
Help :(

Fire Fox II
04-10-2004, 16:53
:cry:

RaouL_BennetH
04-10-2004, 17:13
Scusami, ma per scrivere nel file come fai? non dovresti usare fprintf()?

poi, mi viene in mente un'altra cosa, che librerie di inclusione utilizzi?

ilsensine
04-10-2004, 17:17
Scherzi della bufferizzazione di stdout. Utilizza fflush(stdout) prima della exec.

RaouL_BennetH
04-10-2004, 17:20
Originariamente inviato da ilsensine
Scherzi della bufferizzazione di stdout. Utilizza fflush(stdout) prima della exec.
scusa l'ignoranza, ma la funzione fflush è una funzione standard oppure appartiene solo ai sistemi unix?

Thx.

RaouL.

ilsensine
04-10-2004, 17:29
E' standard

Fire Fox II
04-10-2004, 18:14
Originariamente inviato da ilsensine
Scherzi della bufferizzazione di stdout. Utilizza fflush(stdout) prima della exec.

Ok, grazie del consiglio ;)

Giusto per capire, però, potresti descrivermi quale sarebbe lo "scherzo" dello stdout?

Thanks :)

ilsensine
04-10-2004, 20:19
Le libc utilizzano una bufferizzazione su stdout, e non puoi fare assunzioni su quando il buffer viene svuotato. L'unica cosa certa è che verrà svuotato prima o poi, a meno che non lanci una exec. Arrivati alla exec, tutto quello che riguarda lo stream stdout del tuo processo e che ancora non è stato scritto, viene perso (il tuo "vecchio" processo viene immediatamente sostituito da quello "nuovo", senza possibilità di compiere altro).
In sostanza: non usare stdout se vuoi essere sicuro che qualcosa venga scritto nel punto stesso in cui lo scrivi. Usa la scrittura su stderr, oppure scrivi direttamente sul descrittore di stdout tramite dprintf(fileno(stdout), ...).

Fire Fox II
06-10-2004, 16:47
Originariamente inviato da ilsensine
Le libc utilizzano una bufferizzazione su stdout, e non puoi fare assunzioni su quando il buffer viene svuotato. L'unica cosa certa è che verrà svuotato prima o poi, a meno che non lanci una exec. Arrivati alla exec, tutto quello che riguarda lo stream stdout del tuo processo e che ancora non è stato scritto, viene perso (il tuo "vecchio" processo viene immediatamente sostituito da quello "nuovo", senza possibilità di compiere altro).
In sostanza: non usare stdout se vuoi essere sicuro che qualcosa venga scritto nel punto stesso in cui lo scrivi. Usa la scrittura su stderr, oppure scrivi direttamente sul descrittore di stdout tramite dprintf(fileno(stdout), ...).

Gentilissimo! :)

Penso di aver capito ;)