一个简单的题目(关于printf)一览

2013年4月15日 由 Creater 留言 »

玩linux的人一般都看过《Unix环境高级编程》,那也应该都知道printf是行缓冲的,如果没玩过或许你对以下这个题目就迷惑了。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
	printf("Today is ?\n");
	pause();
	return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
	printf("Today is ?");
	pause();
	return 0;
}

这两段代码的输出有什么不同么?
其实很简单,printf是行缓冲的,只有遇到换行符或者手动强制刷新才会输出。
故第一段代码很快就输出”Today is ?”,第二段代码则在收到一个信号以后才会输出。
再来看看这个题目:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
	printf("call execl"); 
	execl("/bin/sh", "", NULL); 
	printf("error!\n");
}

会输出什么呢?

第一个printf由于没有遇到换行符或者强制刷新,所以暂时不会输出,等到执行execl后由于创建了新的进程,进程切换到了新进程所以原来的数据被丢弃。第二个printf则只有execl执行失败才会执行,当然这里不会失败。

广告位

发表评论

你必须 登陆 方可发表评论.