Cのsleep()関数は、Ubuntu 20.04(WSL)では機能しません。sleep()を機能させる方法はありますか?

Aug 21 2020

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

}

回答

1 Kulfy Aug 21 2020 at 15:24

sleep()システムコールです。WSL 1は実際のLinuxカーネルで構成されていないため、WSL 1では、命令が翻訳され、WindowsNTカーネルによってさらに処理されます。一方、WSL 2は、Linuxカーネルのソースコードに基づいてMicrosoftが構築した実際のLinuxカーネルで構成されているため、システムコールを処理します。

参考までに、これはWSL1アーキテクチャの概要です。

そして、これはWSL2アーキテクチャの概要です。


画像クレジット:Linux用のWindowsサブシステム(WSLおよびWSL2)とは何ですか?—WindowsのLinux-FOSSBYTES

したがって、Linuxカーネルに固有のすべてのシステムコールが変換され、WindowsNTカーネルによって理解されるという保証はありません。

sleep()動作させるには、実際のLinuxカーネル、つまりWSL 2を使用する必要があります。現在使用しているWSLのバージョンを確認するには、コマンドプロンプトまたはPowershellを開いて実行します。

wsl -l -v

これにより、現在WSLのバージョンと状態で使用しているすべてのディストリビューションが一覧表示されます。WSLバージョンを切り替えるには、

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

最初にカーネルをインストールする必要があるかもしれません。Update to WSL 2-MicrosoftDocsを参照できます。


軽いメモでsleep()は、引数としてミリ秒単位の時間がかかり、1ミリ秒は気付かれることは非常に少ないです。少なくとも15000ミリ秒、つまり15秒で試すことをお勧めします。


関連トピック:

  • WSLシステムコール-MicrosoftDocs

  • Windows Subsystem forLinuxの概要-MicrosoftDocs

  • WSL 2の新機能 -Microsoft Docs

  • WSL1とWSL2の比較-MicrosoftDocs

  • Linux用のWindowsサブシステム(WSLおよびWSL2)とは何ですか?—WindowsのLinux-FOSSBYTES