일시 중지를 취소할 때 dmesg가 터미널에 벨을 울리는 이유는 무엇입니까?

일시 중지를 취소할 때 dmesg가 터미널에 벨을 울리는 이유는 무엇입니까?

랩톱 일시 중지를 해제할 때마다 열려 있는(실행 중인) tmux 창이 dmesg -w켜집니다.

창 하나가 강조 표시된 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이 포함되어 있음을 나타냅니다.

관련 정보