一時停止をキャンセルしたときにdmesgがターミナルにベルを鳴らすのはなぜですか?

一時停止をキャンセルしたときにdmesgがターミナルにベルを鳴らすのはなぜですか?

ラップトップの一時停止を解除するたびに、開いている(実行中の)tmuxウィンドウがdmesg -w点灯します。

1つのウィンドウがハイライトされているtmuxステータスバー画像

tmuxのマニュアルページでは、これはウィンドウで実行されているアプリケーションがターミナルベルを鳴らしたことを意味します。

デフォルトでは、同じ設定(同じOS、同じtmux構成)を持つ別のコンピュータがありますが、これは発生しません。これは特定のラップトップでのみ発生します。このシステムで一時停止が解除されると、dmesgでターミナルチャイムが鳴るのはなぜですか?

ソフトウェアバージョン:

$ uname -a
Linux localhost 3.10.18 #1 SMP Mon Jan 8 23:08:08 PST 2018 armv7l armv7l armv7l GNU/Linux
$ lsb_release -cr
Release:        16.04
Codename:       xenial
$ tmux -V
tmux 2.6
$ dmesg --version
dmesg from util-linux 2.27.1

答え1

dmesgの出力を確認すると、ASCII BEL文字を検索してベルが鳴るタイミングを正確に確認できます\a

$ dmesg | grep -C1 $'\a'
[    5.706427] usb 1-2: Manufacturer: HD WebCam
[    5.706434] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[    5.798439] Unsafe core_pattern used with suid_dumpable=2. Pipe handler or fully qualified core dump path required.
--
[13843.531106] usb 1-2: Manufacturer: HD WebCam
[13843.531115] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[13843.546586] uvcvideo: Found UVC 1.00 device HD WebCam (0bda:57cf)

興味深いことに、ウェブカメラを初期化する過程でベルが鳴るようです。 BELがodパイプを介して印刷する行の位置を正確に確認できます。

$ dmesg | grep $'\a' | head -n 1 | od -c
0000000   [                   5   .   7   0   6   4   3   4   ]       u
0000020   s   b       1   -   2   :       S   e   r   i   a   l   N   u
0000040   m   b   e   r   :      \a   N   C   2   1   4   1   1   0   3
0000060   Q   5   3   3   0   2   0   A   A   L   M   0   3  \n
0000076

ここで、BELはで表され、\aシーケンス番号()の前に印刷されますSerialNumber: ␇NC214...。 dmesgが行の途中にBELを挿入する可能性はほとんどないため、カーネルはそれを記録することもできます。

ソースコードを確認してみましょう。たぶん、USBドライバがシリアル番号を記録している間に着信音を印刷している可能性があります。私達は利用できます生きているgrepLinux 4.12ソースコードをすばやく検索すると、関連ファイルがdrivers/usb/core/hub.c万病薬をクリックして関連機能を見つけます。

static void announce_device(struct usb_device *udev)
{
    dev_info(&udev->dev, "New USB device found, idVendor=%04x, idProduct=%04x\n",
        le16_to_cpu(udev->descriptor.idVendor),
        le16_to_cpu(udev->descriptor.idProduct));
    dev_info(&udev->dev,
        "New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
        udev->descriptor.iManufacturer,
        udev->descriptor.iProduct,
        udev->descriptor.iSerialNumber);
    show_string(udev, "Product", udev->product);
    show_string(udev, "Manufacturer", udev->manufacturer);
    show_string(udev, "SerialNumber", udev->serial);
}

show_string上記で定義された非常に単純な関数announce_deviceで、コロンとスペースで区切られた引数を印刷します。

static void show_string(struct usb_device *udev, char *id, char *string)
{
    if (!string)
        return;
    dev_info(&udev->dev, "%s: %s\n", id, string);
}

したがって、着信音を追加するのはカーネルではありません。

USBデバイスのシリアル番号は何ですか?

lsusbを使用して、次のことを確認できます。

$ lsusb -vd 0bda:57cf | grep iSerial
  iSerial                 2 NC2141103Q533020AALM03

さて、今はodを通してパイプしてみましょう。

$ lsusb -vd 0bda:57cf | grep iSerial | od -c
0000000           i   S   e   r   i   a   l
0000020                                           2      \a   N   C   2
0000040   1   4   1   1   0   3   Q   5   3   3   0   2   0   A   A   L
0000060   M   0   3  \n
0000064

これは、ウェブカメラのシリアル番号に実際にASCII BELが含まれていることを示します。

関連情報