Linux下关于printf 与sleep一起运行的困惑

本文探讨了在Linux环境下使用printf和sleep函数时的输出顺序问题,解释了为何在某些情况下会先输出特定字符,涉及标准IO缓存原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      上周末帮助一个同学写个demo验证一下他看书看到的东西,在linux下面先打印"%%",然后再sleep 10秒。结果打印结果立马就出来了,结果同学表示很疑惑,亲自验证,结果尽然是后打印出来。类似于

       printf("%%");
       sleep(10);

      有点晕,网上收了一下大概是跟printf的实现有关系,网上说是由于标准IO的行缓存造成的。貌似printf是把缓冲区写满了才输出的,所以回想起来大概是因为我敲了换行符所以每次都会先打印出来。

      感觉自己的实力好弱啊,怎么办呢就要找工作了。

      网上还有个类似的问题 http://bbs.chinaunix.net/thread-1060743-1-1.html

      主要就是在讨论:

      代码如下:

    #include <stdio.h>

    int main (int argc,char **argv)

    {

                  while (1)

                 {

                          printf ("Hello Linux \n");

                          sleep(1);

                 }

                   return 0;

    }

    输出结果:每隔1秒输出Hello Linux

    将上面代码改成:

    #include <stdio.h>

    int main (int argc,char **argv)

    {

                  while (1)

                 {

                          printf ("Hello Linux ");

                          sleep(1);

                 }

                   return 0;

    }

    即将printf中的\n去掉,此程序运行时不会按照一秒钟输出一次Hello Linux.

    大概过了几十秒输出一大串的Hello Linux.

     现在先占个坑,有机会研究一下linux的IO机制再来补充。



1.编写C程序,初始化一个count变量值为1,然后使用fork函数创建两个子进程,在父进程和子女进程中分别对count变量加1,并分别打印“I am father/son/daughter,count=X”,X是count的值,即分别打印“我是谁和count的值”,最后父进程使用waitpid等待两个子进程结束后退出。2.编译后,多次运行该程序,观察屏幕上显示结果的顺序性,直至出现不一样的情况为止,记下这种情况,并观察每行打印结果中count的值,试简单分析其原因。 3.改写前面的程序,用pthread_create函数代替fork使父进程创建两个线程,用pthread_join函数代替waitpid使父进程等待两个线程结束后退出,其他不变。4.编译链接后,多次运行该次序,观察屏幕上显示结果的顺序性,直至出现不一样的情况为止,记下这种情况,并观察每行打印结果中count的值,试简单分析其原因。5.在Linux平台上编写一段长循环程序,通过ps命令查看进程“运行”状态;6.向进程发送SIGSTOP信号,通过ps命令查看进程的“暂停”状态;向进程发送SIGCONT信号,通过ps命令查看进程恢复到“运行”状态;7.在Linux平台上编写调用sleep函数程序,通过ps查看进程“可中断阻塞”状态;8.在Linux平台上使用vfork创建子进程,通过ps查看主进程“不可中断阻塞”状态;9.在Linux平台上使用fork创建一个子进程,子进程不执行任何操作,而父进程调用sleep函数进入睡眠状态,通过ps命令查看父进程进入“可中断阻塞”状态,子进程进入“僵尸”状态;10.通过以上程序结果,结合资料查询,画出Linux下进程状态的转换图,并思考什么时候出现运行状态、暂停状态、可中断阻塞状态、不可中断阻塞状态以及僵尸状态
最新发布
05-09
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值