Функция sleep () в C не работает в Ubuntu 20.04 (WSL). Есть ли способ заставить работать sleep ()?

Я использую приложение Windows для Ubuntu, чтобы практиковать код 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);
        }

}
1
задан 22 August 2020 в 00:17

1 ответ

sleep () - это системный вызов. В WSL 1 инструкции транслируются и далее обрабатываются ядром Windows NT, поскольку WSL 1 не состоит из реального ядра Linux. С другой стороны, WSL 2 состоит из реального ядра Linux, построенного Microsoft на основе исходного кода ядра Linux и, таким образом, обрабатывает системные вызовы.

Для справки это обзор архитектуры WSL 1:

WSL 1 architecture

И это обзор архитектуры WSL 2:

WSL 2 architecture
Изображение предоставлено : Что такое подсистема Windows для Linux (WSL и WSL2)? - Linux в Windows - 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 () принимает время в миллисекундах в качестве аргумента, а 1 мс намного меньше, чтобы быть обратил внимание. Я предлагаю попробовать не менее 15000 мс, то есть 15 секунд.


Соответствующие темы:

1
ответ дан 24 August 2020 в 08:20

Другие вопросы по тегам:

Похожие вопросы: