수면은 매우 인기있는 명령이며 1 초부터 수면을 시작할 수 있습니다.
# wait one second please
sleep 1
그러나 0.1 초 만 또는 0.1 ~ 1 초를 기다려야하는 경우 대안은 무엇입니까?
- 비고 : 리눅스 또는 OS X에서는
sleep 0.XXX
잘 작동하지만 솔라리스sleep 0.1
또는sleep 0.01
불법 구문
echo "" >/dev/null
수면은 매우 인기있는 명령이며 1 초부터 수면을 시작할 수 있습니다.
# wait one second please
sleep 1
그러나 0.1 초 만 또는 0.1 ~ 1 초를 기다려야하는 경우 대안은 무엇입니까?
sleep 0.XXX
잘 작동하지만 솔라리스 sleep 0.1
또는 sleep 0.01
불법 구문echo "" >/dev/null
답변:
Bash에는 "로드 가능"절전 모드가있어 초 단위를 지원하고 외부 명령의 오버 헤드를 제거합니다.
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
그때:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
단점은로드 가능한 bash
파일에 바이너리 가 제공되지 않을 수 있으므로 표시된대로 직접 컴파일해야합니다 (Solaris에서는 위와 같이 단순하지는 않지만).
현재bash-4.4
(9 월 (2016)) 모든 loadables 이제 내장되어 있으며 별도의 공유 객체 파일로 내장되어 있지만,이를 지원하는 플랫폼에 기본적으로 설치하고,없는 .so
접미사. 배포판 / OS에서 창의적인 작업을 수행하지 않은 경우 대신 다음을 수행 할 수 있습니다.
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(맨 페이지 BASH_LOADABLES_PATH
는 자동으로 설정되어 있음을 의미합니다 . 4.4.12의 공식 배포판에서는 그렇지 enable -f filename commandname
않습니다. 올바르게 설정하면 필요할 때만 필요합니다.)
그것이 적합하지 않다면, 다음으로해야 할 가장 쉬운 일은 sleep
GNU coreutils에서 빌드하거나 얻는 것입니다. 이것은 필요한 기능을 지원합니다. POSIX sleep
명령은 최소한의 이전 Solaris 버전에서만 구현되었습니다. Solaris 11 sleep
은 소수 초를 지원합니다.
최후의 수단으로 perl
통역사를 초기화하는 것이 의도 한 수면 시간과 비슷하다는 경고와 함께 사용할 수 있습니다 (또는 다른 스크립팅).
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
expect
" after N
"(여기서 N은 밀리 초)을 사용할 수 있습니다.
usleep
@Luis Vazquez와 @sebix write처럼 사용
coreutilssleep
명령에 대한 설명서 는 다음과 같습니다.
역사적으로 수면을 구현하려면 숫자가 정수 여야하고 접미사없이 단일 인수 만 허용했습니다. 그러나 GNU 절전 모드는 임의의 부동 소수점 숫자를 허용합니다. 부동 소수점을 참조하십시오 .
따라서 당신이 사용할 수있는 sleep 0.1
, sleep 1.0e-1
및 이와 유사한 인수.
수면은 10 진수를 허용하므로 다음과 같이 분류 할 수 있습니다.
초당 1/2
sleep 0.5
1/100 초
sleep 0.01
그래서 밀리 초 동안 당신은 원할 것입니다
sleep 0.001
sleep .5
정확도를 확인하려면 다음을 시도하십시오.
time sleep 0.5 # 500 milliseconds (1/2 of a second)
time sleep 0.001 # 1 millisecond (1/1000 of a second)
time sleep 1.0 # 1 second (1000 milliseconds)
조합 mr.spuratic의 솔루션 및 콜스의 솔루션 .
당신은 단순히 사용할 수 있습니다 usleep
. 매개 변수로 마이크로 초 (= 1e-6 초)가 걸리므로 1 밀리 초 동안 대기하려면 다음을 입력하십시오.
usleep 1000
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
일부를 의미합니다 initscripts
. 최소한 RHEL, CentOS, Fedora, Mageia / Mandriva 및 SuSE를 포함합니다. 여기에 예 :````
sleep
(에서 로 coreutils -) 초와 함께 작동 usleep
(에서 의 초기화 스크립트 ) 마이크로 초와 함께 작동
나는 같은 문제 (Solaris에서 쉘 유휴 상태가 아님)가 있었으므로 내 자신의 글을 다음과 같이 작성했다.
#include "stdio.h"
int main(int argc, char **argv) {
if(argc == 2) { usleep(atoi(argv[1])); }
return 0;
}
인수를 확인하지 않습니다-당신이 그것을 유지하고 싶지만 (gcc usleep.c -o usleep) 당신을 구멍에서 빠져 나올 경우 제대로 작성된 것을 추천합니다.
usleep()
호출은 if(argc == 1) { usleep(atoi(argv[1])); }
예기치 않은 동작의 번호로 이어질 수있는 배열의 범위, 외부 인덱싱을 방지 할 수 있습니다.
if (argc == 2) { usleep(atoi(argv[1])); }
...
usleep
단위는 μs이므로 1 초 동안 기다리려면 1000000 개의 인수를 제공해야합니다.
atoi()
문자열을로 변환하는 끔찍한 선택 int
입니다. 무엇을 atoi( "STRING" )
반환합니까? atoi()
오류를 반환 할 방법이 없습니다.
나는 수면 아이디어를 좋아하지만 그 아래에 의견을 말할 수는 없습니다. 이것이 나에게 도움이 되었기 때문에 내 제안이 유휴 아이디어를 개선 할 수 있기를 바랍니다.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c 는 Redhat 생태계에서 usleep.c의 실제 소스 코드입니다.
솔라리스에서 컴파일 해보십시오. 아마도 https://www.opencsw.org/packages/libpopt0/이 필요할 것입니다 .