欢迎访问我司网站!我们是低阻值电阻产品解决方案提供商,

首页

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

``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授权发布,属于原作者,该平台提供信息存储服务,仅文章代表个人观点, 并不意味着。

这个平台的位置,如果您有任何疑问,请与我们联系,谢谢!