睡在哪裡?
我在 Jetson Nano 上執行 JetPak 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-linux
沒有sysvinit-utils
顯示任何usleep
文件。這個答案是Ubuntu 有睡眠嗎?,建議安裝 BusyBox,我這樣做了,但沒有幫助。這個對同一問題的回答可能有一個解決方案(埋在
nosql
包中),但在嘗試之前,我寧願只知道它應該在哪裡,為什麼這麼難找到?該命令本身是否已被棄用?
PHP 可以更新為
sleep
使用浮點秒呼叫(GNU 風格);usleep
“睡了幾微秒”,一秒鐘內有一百萬個,所以給定一個$SleepStep
100000$ echo 100000 1000000 / p | dc .1000
這相當於一個
sleep 0.1
電話。(GNUsleep
,而不是不採用浮點值的其他類型。)讓自己睡覺
usleep(1)
應該不會太難找到原始碼並手動編譯,或者編寫;最棘手的部分是將使用者提供的輸入轉換為usleep(3)
呼叫值,一個希望為正的 32 位整數。perl -MTime::HiRes=usleep -e 'usleep shift' 100000
但這在我的系統上有大約 30 毫秒的成本,所以理想情況下你會想要一個
usleep(1)
.非標
usleep(1)
否則不是標準的(非linux系統可能沒有它。他們可能沒有 GNUsleep
,或者,或者可能改為呼叫它gsleep
。)。手冊頁表明usleep
是由 RedHat 的一些人撰寫的;RedHat 可能會決定停止支持它,然後誰知道其他各種 Linux 供應商會在那時做什麼。這就是使用 POSIX 指定的工具可以提供幫助的地方。Shell 腳本中接近零秒的問題
此外,在 shell 腳本中睡眠接近零秒也會成為問題,尤其是在速度較慢、非常繁忙或時間控制不佳的系統(可能是 virts)上。隨著睡眠延遲接近零,fork/exec
usleep
(或分數sleep
呼叫)的成本將主導執行時。usleep(3)
在具有或類似系統呼叫的程序中處理短暫的睡眠會好得多。這將比分叉的成本少得多*。*內部化呼叫
因此,在 PHP 中,人們可能會這樣呼叫usleep:
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
的)而不是一個,但是提高了 sleep 的可移植性。