解释在Android上执行的Unix sleep()函数的行为

Explain behavior of Unix sleep() function executed on Android

本文关键字:函数 sleep Unix Android 执行 解释      更新时间:2023-10-16

我目前正在有根的Android设备上编译和执行一些C++代码。我使用adb(adb shell)。为了编译我的代码,我不使用 NDK,但我使用 CMake 交叉编译

我正在使用unistd.h的函数sleep(seconds)

我在Android上使用该功能经历了一些奇怪的行为:基本上,我有一个for循环,其中我std::cout的东西,然后调用sleep(x)

如果我调用sleep(1),则行为是预期的:程序等待 1 秒,然后执行下一条指令。

如果我打电话给sleep(2),行为不是预期的。该程序永远停留在该指令上。直到我按下 PC 键盘上的一个键(不是设备的键盘),然后它卡在下一个sleep(2)......直到我按下键,等等...

仅当设备屏幕关闭时,才会发生此行为。一旦我单击电源按钮打开屏幕,程序就会恢复并具有预期的行为。

注意:行为与usleep(useconds)相同

我试图查看限制在 1 到 2 秒之间:1.5秒、1.25秒、1.125秒 ->始终保持封锁状态 |1.0625s -> ~50% 几率保持封锁。

显然,如果线程睡眠超过 1 秒(至少 2 秒),有一些东西会阻止线程唤醒。所以我的问题是,有没有人知道为什么会发生这种情况,并对过程有详细的解释?

谢谢!

Android在不

进行任何用户交互时将应用程序置于后台 - Unix睡眠和Java计时器等不会唤醒它们。 您必须使用安卓警报或可运行的 postDelay 处理程序。