跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
捷比信电阻高精密 · 大功率无感 · 金属膜电阻

``Linux永远不会执行的程序''

1.前言"我的性格好不好! Linux没有将我的线程调度半小时!”。几天前一位同事抱怨说:“ Linux是一个多线程系统,每个线程都有一个时间片,为什么我的程序似乎还没有被调度”,然后向我展示了执行过程。大致归纳为以下代码逻辑。程序启动后,仅一行“ run”开始。输出,然后就没有了。喝咖啡,吃瓜子,有偿钓鱼,屏幕很干净。在理想状态下,输出“做”到输出。每10秒执行一次任务后。通过分析代码逻辑,我们可以看到“推断”的基础是可理解的。代码是否正在执行是“ do”的输出。在屏幕上,“这真的科学吗?答案是不。 Linux有一个雨露计划系统,很难在半小时内保持不变。排程。问题在于Linux的“行缓冲”机制。机制。 void main(){printf(“ run

”); while(1){sleep(10); do_thing(); printf(“ do”); }} 2.行缓冲上面的printf输出目标设备由STDOUT指定,它可能指向波特率为115200的串行端口。设备也可能指向本地图形设备。与CPU相比,它们的速度要慢几个数量级。它们都是为了提高机器或程序的性能并提高CPU利用率。协调高速设备和低速设备之间的速度差异为了进行匹配,操作系统默认情况下在标准I / O上使用行缓冲机制。首先将printf的内容存储在内存中,然后当缓冲区已满或检测到换行符时,将其输出到目标设备。 Linux上的默认行缓冲区为1024Byte,每10s输出占用2Byte,为了等待缓冲区填满,您需要等待81分钟。了解原理之后,解决方案很简单。方法1:强制刷新以刷新标准输出stdout #include void main(){printf(“ run

”); while(1){sleep(10); do_thing(); fflush(stdout); printf(“ do”); }}方法2:输出“ newline” #include void main(){printf(“ run

”); while(1){sleep(10); do_thing(); printf(“ do

");}} END来源:写一个解决方案,作者:吴军解决方案免责声明:本文经21ic授权发布,属于原作者,该平台提供信息存储服务,仅文章代表个人观点, 并不意味着。这个平台的位置,如果您有任何疑问,请与我们联系,谢谢!