Я использую приложение 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);
}
}
sleep ()
- это системный вызов. В WSL 1 инструкции транслируются и далее обрабатываются ядром Windows NT, поскольку WSL 1 не состоит из реального ядра Linux. С другой стороны, WSL 2 состоит из реального ядра Linux, построенного Microsoft на основе исходного кода ядра Linux и, таким образом, обрабатывает системные вызовы.
Для справки это обзор архитектуры WSL 1:
И это обзор архитектуры WSL 2:
Изображение предоставлено : Что такое подсистема 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 секунд.