La funzione sleep() in C non funziona su Ubuntu 20.04 (WSL). C'è un modo per far funzionare sleep ()?

Aug 21 2020

Sto usando un'app di Windows per Ubuntu per esercitarmi con il codice C/C++.

Alla fine ho scoperto che sleep()la chiamata non funziona qui. Ho esaminato le risposte fornite in precedenza su altri post ma non sono riuscito a trovare alcuna soluzione pertinente.

Quindi voglio solo sapere se c'è un modo per fare sleep()o un tipo simile di chiamata in attesa per lavorare sulla stessa applicazione Ubuntu?

Codice di esempio:

#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);
        }

}

Risposte

1 Kulfy Aug 21 2020 at 15:24

sleep()è una chiamata di sistema. In WSL 1 le istruzioni vengono tradotte e ulteriormente gestite dal kernel di Windows NT poiché WSL 1 non è costituito da un vero kernel Linux. D'altra parte, WSL 2 è costituito da un vero kernel Linux creato da Microsoft sulla base del codice sorgente del kernel Linux e quindi gestisce le chiamate di sistema.

Per tuo riferimento, questa è una panoramica dell'architettura WSL 1:

E questa è una panoramica dell'architettura WSL 2:


Crediti immagine : cos'è il sottosistema Windows per Linux (WSL e WSL2)? — Linux in Windows - FOSSBYTES

Quindi, non c'è alcuna garanzia che tutte le chiamate di sistema specifiche del kernel Linux siano tradotte e siano comprese dal kernel di Windows NT.

Per sleep()funzionare, devi utilizzare il vero kernel Linux, ovvero WSL 2. Per vedere quale versione WSL stai attualmente utilizzando, apri il prompt dei comandi o Powershell ed esegui

wsl -l -v

Questo elencherà tutte le distribuzioni attualmente in uso con la versione e lo stato di WSL. Per cambiare le versioni di WSL, eseguire

wsl --set-version distributionName WSLversion # eg:  wsl --set-version ubuntu-20.04 2 

Potrebbe essere necessario installare prima il kernel . È possibile fare riferimento a Aggiornamento a WSL 2-Microsoft Docs .


Su una nota più leggera, sleep()richiede tempo in millisecondi come argomento e 1 ms è molto meno da notare. Suggerisco di provare con almeno 15000 ms, cioè 15 secondi.


Argomenti rilevanti:

  • Chiamate di sistema WSL-Microsoft Docs

  • Panoramica del sottosistema Windows per Linux - Microsoft Docs

  • Cosa c'è di nuovo in WSL 2? - Documenti Microsoft

  • Confronto tra WSL 1 e WSL 2 - Microsoft Docs

  • Che cos'è il sottosistema Windows per Linux (WSL e WSL2)? — Linux in Windows - FOSSBYTES