File: streams-and-buffering.c
/**
* visualizza, carattere-per-carattere, una serie di righe per evidenziare la
* differenza in termini di buffering tra lo standard output (line buffered) e
* lo standard error (unbuffered)
*/
#include "lib-misc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define PHRASE "Hello World!"
#define LINES 3
void print_phrases(FILE *channel) {
char phrase[] = PHRASE;
struct timespec pause = {0, 100 * 1000000};
for (int i = 0; i < LINES; i++) {
for (int j = 0; j < strlen(phrase); j++) {
nanosleep(&pause, NULL);
fputc(phrase[j], channel);
}
fputc('\n', channel);
}
}
int main(int argc, char *argv[]) {
printf("Messaggio sullo standard error (unbuffered): \n");
print_phrases(stderr);
printf("\nMessaggio sullo standard output (line buffered): \n");
print_phrases(stdout);
printf("\nDisabilito buffering su standard output...\n");
setbuf(stdout, NULL);
printf("\nMessaggio sullo standard output (unbuffered): \n");
print_phrases(stdout);
exit(EXIT_SUCCESS);
}