【问题标题】:why delay is not available in gcc [closed]为什么延迟在 gcc 中不可用 [关闭]
【发布时间】:2012-12-06 06:38:10
【问题描述】:

为什么延迟在 gcc 中不可用?根据我的理解,延迟功能暂停程序,而睡眠功能使程序进入睡眠状态并执行上下文切换。如果我想停止我的程序,gcc 中的可用选项是什么?

【问题讨论】:

  • 您想阻止上下文切换?就像把机器弄下来一样?您只需要在非多任务操作系统上sleep。 Linux 不行。
  • implement time delay in c 的可能重复项(至少,就我能破译的问题而言)
  • @Potatoswatter 我希望系统停止...这是我的程序要求
  • @Brian Roach 您指出的线程还使用了进行上下文切换的睡眠和时间函数...
  • 你可能想说为什么或什么样的程序会有这样的要求。通常这就是非常严重的崩溃的定义。

标签: c linux


【解决方案1】:

因为据我所知,delay 不在 C99 或 C2011 标准中。

C 标准在 API 方面很差(它主要知道FILE*,一些内存操作,如malloc,一些字符串操作,以及setjmp ...;它不知道目录或延迟) .

上下文切换在纯标准 C 中没有意义。(它只在 Unix 等多任务操作系统上有意义)。

(非标准C)编程环境应提供延迟功能。在 Linux 上,它是 Posix 的超集,确实具有sleep 和许多其他功能。您可以使用 sched_yield(2) 系统调用来“强制”进行上下文切换。

你应该读一些像Advanced Linux Programming这样的书。也许要停止系统你想使用sync(2)reboot(2) 系统调用,但这可能是个坏主意;你可能想跑,例如使用system(3)shutdownhalt 命令。

如果您只想停止您的特定程序(并让系统的其余部分照常运行其他进程),只需调用 C 标准中 exit(3)

附言。如果您编写内核设备驱动程序,您应该在问题中明确说明,您确实应该了解更多关于 Linux 的信息。在某些驱动程序中,您可能会在遇到严重问题时调用一些恐慌函数。

【讨论】:

  • 他想防止上下文切换。在这方面sched_yieldsleep 具有相同的效果。 “解决”他的问题涉及完全离开 Linux,或者在内核中运行程序。
  • 同意,我确实写道sched_yield 将强制进行上下文切换。其实我有种奇怪的感觉,原帖Mustafa不懂Linux,再不学就会有很多麻烦....
  • 即使 delay 在 C 标准中,您也会在 libc 中找到它,而不是在 gcc 中。
  • 设备驱动程序在内核中运行。它不是 C 程序(通常是内核模块)。从技术上讲,整个内核是一个独立的实现,不遵循通常的 C 标准。但是在编写任何驱动程序之前,你应该了解很多关于 Linux 的知识(阅读几本书,精通应用级系统编程......)。
  • Basile - 对一个令人遗憾的问题的出色回答。真诚的祝福。
【解决方案2】:

如果您执行sleep(),则操作系统会立即切换上下文。这种行为不满足你吗?换句话说,你想在给定的时间段内持有 CPU 并且什么都不做吗?然后做busy_waiting; for(; ; ;) break_if_time_elapses。即使这样,您也无法逃脱操作系统基于时间片的上下文切换。所以它在很短的时间内有意义,小于操作系统的时间片。

【讨论】:

  • 感谢 cwyang 这可能是一个选项,但如何施加一些指定的时间量,例如暂停 3 秒。
  • 在内核中你不能停止 3 秒。如果你这样做了,你可能会在物理上破坏硬件(例如,因为一些粉丝不会活跃)。
  • @Basile Starynkevitch 感谢您的帮助。我想我需要学习很多:(
  • 不,你需要学习很多东西。这意味着几个月的学习。在您不熟悉应用程序级系统编程之前,不要在内核中玩耍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多