• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-04-15)  Linux应用 |   6 条评论  14 
    文章评分 0 次,平均分 0.0

    玩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执行失败才会执行,当然这里不会失败。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/628.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享