usleep在哪里?

usleep在哪里?

我在 Jetson Nano 上运行 JetPack 4.6.1,并且PHP脚本我正在尝试运行抱怨没有usleep

sh: 1: usleep: not found

的答案Linux usleep:找不到命令,为什么?建议它应该在initscripts(RH 上)并且Debian 显然是一样的。但是,initscripts已折旧并被util-linux(或sysvinit-utils) 取代。我安装了util-linux但是还是找不到usleep

事实上,查看所有三个包的文件列表(initscripts,util-linuxsysvinit-utils)不会泄露任何usleep文件。

回答Ubuntu 有 usleep 吗?,建议安装 BusyBox,我照做了,但没有帮助。这回答对于同一问题可能有一个解决方案(埋在nosql包内),但在尝试之前,我只想知道它在哪里应该是的,为什么这么难找到呢?该命令本身是否已被弃用?

答案1

PHP 可以更新为sleep使用浮点秒调用(GNU 风格);usleep“休眠一定数量的微秒”,一秒内有 100 万个,因此给定 a $SleepStep为 100000

$ echo 100000 1000000 / p | dc
.1000

这相当于一个sleep 0.1电话。 (GNU sleep,而不是其他不采用浮点值的类型。)

让我们自己睡觉

usleep(1)找到源代码并手动编译或编写应该不会太困难;最棘手的部分是将用户提供的输入转换为 usleep(3)调用值,希望是一个 32 位正整数。

perl -MTime::HiRes=usleep -e 'usleep shift' 100000

但这在我的系统上大约需要 30 毫秒的开销,因此理想情况下您需要usleep(1).

非标

usleep(1)否则不是标准的(非 Linux 系统可能不会有它。sleep就此而言,它们也可能没有 GNU ,或者可能会调用它gsleep。)。手册页表明usleep是由 RedHat 的一些人编写的; RedHat 可能会决定停止支持它,然后谁知道其他各种 Linux 供应商届时会做什么。这就是使用 POSIX 指定的工具可以提供帮助的地方。

Shell 脚本中接近零秒的问题

另外,在 shell 脚本中睡眠接近零秒也会成为问题,尤其是在速度较慢、非常繁忙或时间控制较差的系统(也许是虚拟机)上。当睡眠延迟接近零时,fork/exec usleep(或部分sleep调用)的开销将在运行时占据主导地位。在具有usleep(3)或类似系统调用的进程中可以更好地处理短暂睡眠。这将会有很多比支出更少的开销。

内化呼叫

因此,在 PHP 中,人们可能会调用睡眠因此:

exec ("v4l2-ctl -d {$Device} -c tilt_speed=1");
# TODO check for a v4l2-ctl non-zero exit here
usleep($SleepStep);
exec ("v4l2-ctl -d {$Device} -c tilt_speed=0");

这有两个system(3)调用(PHP 的调用exec)而不是一个,但睡眠的可移植性得到了提高。

答案2

您的问题的一部分似乎是问如何在几年过去后找到带有实用程序命令的包,并且该命令可能已移动到另一个包(或者可能有多个实现,有些仍然可用)。对于 Debian 和 Ubuntu,它们的软件包搜索网站使此类搜索变得更加容易。 IE,https://packages.debian.org/https://packages.ubuntu.com/分别。

习惯上的搜索框名为搜索包目录,通常对这种搜索没有帮助,但是下面的搜索框名为搜索包内容将要。单击其名称的文件的复选框/单选按钮结尾关键字中是关键。

在 Debian 和 Ubuntu 站点上,此搜索显示软件包 gnulib、epic4-help、scheme9 和 lmbench 包含可能对您有用的文件。最有可能的是 lmbench - 其他看起来像帮助文本而不是可执行代码。

我不知道带有 yum/rpm 软件包存储库的发行版是否具有类似的搜索功能,但 Debian/Ubuntu 的发行版在某些情况下对我非常有用。

相关内容