下午来来相写个小程序的,调试时,遇到的小问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
void
*server(
void
*arg)
{
printf
(
"1222\n"
);
printf
(
"fdsafdsafa\n"
);
printf
(
"thread start...."
);
return
(
void
*)0;
}
int
main(
int
argc,
char
*argv[])
{
pthread_t tidp;
int
ret=-1;
ret = pthread_create(&tidp,NULL,server,NULL);
printf
(
"wait...."
);
while
(1);
return
0;
}
|
最后代码删除到这,发现server函数中printf中有\n的能输出,最后输出没有\n的不输出。。。。google后,说是printf是一个行缓冲打印的东西。。。。。后来做个试验,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include<stdio.h>
#include <unistd.h>
int
main(
int
argc,
char
*argv[])
{
int
ret=-1;
printf
(
"%d"
,1);
printf
(
"wait...."
);
while
(1);
return
0;
}
|
以前没有留意。。。。
解释如下
标准输入和标准输出是行缓冲,比如printf,sacnf. 你printf("hello"),这字符串没有\n,就会先存放在缓冲区,这个缓冲区是printf内部malloc的堆区,并不会马上输出到终端,当程序正常结束时(return 0),才会将缓冲区的数据转到相应的地方。如果有\n,则存放到缓冲区后会马上输出到终端。
标准错误不缓冲,也就是不管你有没\n都会马上输出到终端
普通文件的输入输出则是全缓冲 如fprintf,fscanf.,即不管你有没\n都要等把缓冲区装满或程序正常结束是才会把数据转到相应地方。
当然你还可用fflush强制刷新缓冲区将数据转到相应的地方