C의 sleep () 함수는 Ubuntu 20.04 (WSL)에서 작동하지 않습니다. sleep ()을 작동시키는 방법이 있습니까?
Ubuntu 용 Windows 앱을 사용하여 C / C ++ 코드를 연습하고 있습니다.
결국 나는 sleep()
전화가 여기서 작동하지 않는다는 것을 알았 습니다. 다른 게시물에서 이전에 제공된 답변을 살펴 보았지만 관련 솔루션을 찾지 못했습니다.
따라서 sleep()
동일한 Ubuntu 응용 프로그램에서 작동하기 위해 호출을 할 수있는 방법이 있는지 또는 유사한 종류의 대기 호출 이 있는지 알고 싶습니다 .
예제 코드 :
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
void handler(int num)
{
write(STDOUT_FILENO, "I am in handler...handling signal\n", 13);
}
int main(int argc, char **argv)
{
signal(SIGINT, handler);
signal(SIGTERM,handler);
while(1)
{
printf("Just wasting your time! PID = %d\n", getpid());
sleep(1);
}
}
답변
sleep()시스템 호출입니다. WSL 1에서는 WSL 1이 실제 Linux 커널 로 구성되지 않기 때문에 Windows NT 커널 에서 지침이 번역 되고 추가로 처리됩니다 . 반면 WSL 2는 Linux 커널의 소스 코드를 기반으로 Microsoft에서 빌드 한 실제 Linux 커널 로 구성되어 있으므로 시스템 호출을 처리합니다.
참고로 이것은 WSL 1 아키텍처의 개요입니다.

다음은 WSL 2 아키텍처의 개요입니다.

이미지 크레딧 : Linux 용 Windows 하위 시스템 (WSL 및 WSL2)이란 무엇입니까? — Windows의 Linux-FOSSBYTES
따라서 Linux 커널에 특정한 모든 시스템 호출이 번역되고 Windows NT 커널에서 이해된다는 보장은 없습니다.
sleep()
작동 하려면 실제 Linux 커널, 즉 WSL 2를 사용해야합니다. 현재 사용중인 WSL 버전을 확인하려면 명령 프롬프트 또는 Powershell을 열고
wsl -l -v
현재 WSL 버전 및 상태와 함께 사용중인 모든 배포가 나열됩니다. WSL 버전을 전환하려면 실행
wsl --set-version distributionName WSLversion # eg: wsl --set-version ubuntu-20.04 2
먼저 커널 을 설치해야 할 수도 있습니다 . WSL 2 업데이트-Microsoft Docs를 참조 할 수 있습니다 .
더 가벼운 메모에서 sleep()
인수로 밀리 초 단위의 시간이 걸리며 1ms는 눈에 띄지 않습니다. 적어도 15000ms, 즉 15 초로 시도하는 것이 좋습니다.
관련 주제 :
WSL 시스템 호출-Microsoft Docs
Linux 용 Windows 하위 시스템 개요-Microsoft Docs
WSL 2의 새로운 기능 -Microsoft 문서
WSL 1과 WSL 2 비교-Microsoft Docs
Linux 용 Windows 하위 시스템 (WSL 및 WSL2)이란 무엇입니까? — Windows의 Linux-FOSSBYTES