sleep() / Sleep() behaviors in Linux / Windows [duplicate] - c

This question already has answers here:
Why does printf not flush after the call unless a newline is in the format string?
(10 answers)
Closed 8 years ago.
#include <stdlib.h>
int main()
{
printf("\nHello");
sleep(5);
printf("\nLinux");
}
In my expectation, It should be like:
PRINT Hello --- WAIT 5 SECS ---> PRINT Linux
But actually it will be like this:
WAIT 5 SECS --> PRINT Hello --> PRINT Linux
Why ? How to make my program be the first one (as my expectation) ?
And why my code can run expectedly on Win32 Console?

Your stream is line-buffered, as you don't end your string with \n, flush it using fflush.
Change your program to:
int main()
{
printf("\nHello");
fflush(stdout);
sleep(5);
printf("\nLinux");
}

The output is buffered and is not printed until newline.
Try with:
printf("\nHello\n");
sleep(5);
printf("Linux");

Related

Why do I need "\n" in c, when using the sleep function? [duplicate]

This question already has answers here:
What is it with printf() sending output to buffer?
(3 answers)
Closed 1 year ago.
My code:
#include <stdio.h>
#include <unistd.h>
int main(){
printf("I sleep\n");
sleep(3);
printf("\033[H\033[J");
return 0;
}
if I don't write "\n" in the printf-function, "I sleep" wil not be displayed, until sleep(3) is done.
Can someone explain? Thanks!
The standard output stream, when not outputting to a file or device, is line-buffered by default on most UNIX-like systems.
That mean that text sent there typically won't actually be printed until a newline character is encountered.

"\r" in C stops output before it [duplicate]

This question already has answers here:
Why does printf() not print anything before sleep()?
(4 answers)
Closed 1 year ago.
I wrote a piece of code like this:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("one");
sleep(1);
printf("\r");
printf("two");
return 0;
}
It was supposed to first print "one", and then override it by "two" after one second's pause.
But what really happened is that it only print "two" after one second's empty, without printing "one" first. I am confused, can someone figure it out? Thanks a lot.
The statement printf("one") does not immediately print "one" to the terminal, but it writes the string to the standard output stream (stdout) - which is usually buffered. Only when this stream is flushed, do its contents get printed to the terminal. Usually, this happens whenever a newline is printed or when the program exits, among other conditions.
The output stream can be forced to flush by calling fflush(stdout), which produces the desired result:
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("one");
fflush(stdout); // Line added
sleep(1);
printf("\r");
printf("two");
return 0;
}
See fflush for more information. The buffering mode of a stream can be set using the setvbuf function.
Also, note that the usual main signature, when using no parameters, is int main(void).
Acknowledgements: Thanks to Andreas Wenzel for a correction and the setvbuf addition.

why system function execute first [duplicate]

This question already has answers here:
in c system() executes before printf() even when printf come first [duplicate]
(1 answer)
Why does printf not flush after the call unless a newline is in the format string?
(10 answers)
Closed 1 year ago.
the problem is when i run this code the system function start first and as per my understanding (which is very little), printf function should start first then the system function !
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("test1");
system("echo 'test2'");
}
and it output :
test2
test1
but the output should be like this instead!
test1
test2
You have to add a line break (\n) to the printf statement. I can only give you my basic (probably not entirely correct) explanation. printf gives the characters to a buffer for printing to the console. This buffer is then printed per line. If you add the \n the line is printed instantly.
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("test1\n");
system("echo 'test2'");
}
i just find the explination its when we say printf is actually what we call buffered the output that we ask to print to standard out in this case our display doesn't come to the display immediately it goes into a holding pool a buffer and when that buffer gets filled up it'll dump everything out at once it's an efficiency consideration but if we print out a new line that \n it will go ahead and it will flush the buffer out right ,so to fix it we can use :
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("test1\n");
system("echo 'test2'");
}
or :
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("test1");
fflush(stdout);
system("echo 'test2'");
}
both do the same job (flush the output buffer).

C: printf still not flushing before while loop, even with new line character in format string [duplicate]

This question already has answers here:
What are the rules of automatic stdout buffer flushing in C?
(5 answers)
Is stdout line buffered, unbuffered or indeterminate by default?
(1 answer)
Closed 3 years ago.
I have read many questions with people asking why printf did not work before a while loop; the answer was that it was not flushing stdout because they did not have a new line character in their format string. However, the following simple code is still not producing output for me:
#include <stdio.h>
int main() {
printf("Hello world!\n");
while (1);
return 0;
}
However, adding fflush(stdout); after the printf call produces output. The new line character is supposed to make this unnecessary, so why does it not work without it?
It's quite common for stdout to be line-buffered when connected to a terminal (flushed on line feed), and block-buffered otherwise (flushed when buffer is full).
For example,
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("foo\n");
sleep(5);
return 0;
}
Test:
$ ./a
foo
[5s pause]
$ ./a | cat
[5s pause]
foo
(gcc on Linux)
I'm using mingw with Eclipse on Windows.
It seems that Eclipse is connecting the stdout of your program to a pipe so it can collect the output and display it in its window. Your program thus uses block buffering for stdout.
A very good answer by #schot here.
He said :
The C99 standard does not specify if the three standard streams are unbuffered or line buffered: It is up to the implementation. All UNIX implementations I know have a line buffered stdin. On Linux, stdout is line buffered and stderr unbuffered.
One way to be sure that your line(s) will be printed directly is making stdout unbuffered:
setbuf(stdout, NULL);
/* or */
setvbuf(stdout, NULL, _IONBF, 0);
But you can only do this once, and it must be before you write to stdout or perform any other operantion on it. (C99 7.19.5.5 2)
Additional Info :
Shouldn't a new line character flush the output?
-It depends, if the output device is determined to be interactive (e.g. a terminal) the newline flush the buffer. Otherwise new line(s) don't flush the buffer.
What constitutes an interactive device is implementation-defined (C99 section 5.1.2.3/6) 

in c system() executes before printf() even when printf come first [duplicate]

This question already has an answer here:
C/Unix Strange behaviour while using system calls and printf
(1 answer)
Closed 3 years ago.
I just started using the system() function in c, and I thought of starting the same executable from within it self using the system function, so I wrote the following program
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("some string");
system("./a.out");
}
-I used gcc to compile it-
when I ran the program it did not print anything, it just kept going until I used the shortcut ctrl-c to stop the execution,then it started printing the output(it did not print anything until I stopped it)
I believe the statements should execute sequentially, why did it not print anything until I stopped it?
By default, when stdoutis connected to a terminal, it is line-buffered.
printf("some string");
doesn't have a '\n' in it and you aren't calling fflush(stdout); after it either, so all this printf("some string"); does is copy "some string" into your stdout's output buffer.
The buffer is flushed as the end of main.
printf("some string\n"); would flush the buffer immediately, provided stdout is connected to a terminal and you didn't change stdout's buffering.
printf("some string"); fflush(stdout); will flush the buffer immediately regardless of context and without the need for the '\n'.

Resources