Khi X bắt đầu, nó tìm kiếm VT không sử dụng thấp nhất và gắn vào nó. Vấn đề của tôi là khi có một số quy trình X đang chạy, tôi cần có khả năng xác định cái nào đang hoạt động.
Đây là một câu hỏi * BSD, bởi vì trên linux thật dễ dàng: X đặt thiết bị đầu cuối kiểm soát của nó thành ttyN
, hoặc, trên các bản phân phối rất cũ, nó được chỉ định trên dòng lệnh như vtN
. Vì vậy, tôi đang chạy một dịch vụ và tôi thấy rằng VT hiện đang hoạt động tty7
và có hai máy chủ X đang chạy, thật dễ dàng để biết cái nào tương ứng với thiết bị đầu cuối hiện tại. (Đây là một trường hợp hợp lý: có lẽ người dùng sử dụng chức năng 'người sử dụng chuyển đổi' GNOME / KDE hoặc chạy hai máy chủ sử dụng startx
.) Một ứng dụng ví dụ mà có thể muốn làm theo các máy chủ X hoạt động là x11vnc
(được chia hai từ phần mềm tôi đang phát triển ).
Mặc dù trên FreeBSD, thiết bị đầu cuối kiểm soát không cho bạn biết bất cứ điều gì. Khi X được bắt đầu từ ttyv1, đó vẫn là thiết bị đầu cuối kiểm soát.
Cập nhật
Tôi đã thực hiện thẩm định và đọc mã X. Sau một số cuộc săn lùng xung quanh, bây giờ nó rõ ràng hơn với tôi những gì đang diễn ra.
Trong lnx_init.c , máy chủ X sẽ setsid
tự tạo một phiên mới, sau đó mở một fd để ttyN
ngay sau đó để thực hiện một VT_ACTIVATE
ioctl trên đó. Khá chuẩn; mở fd cho thiết bị đầu cuối không có quá trình kiểm soát từ quy trình không có thiết bị đầu cuối kiểm soát liên kết cả hai và máy chủ giữ fd mở, do đó đảm bảo rằng thiết bị đầu cuối sẽ vẫn là thiết bị đầu cuối kiểm soát cho máy chủ X.
Bây giờ, trong bsd_init.c , việc mở fd cho tty sẽ được sử dụng làm bộ đệm khung không biến nó thành thiết bị đầu cuối kiểm soát (và trên thực tế, không setsid
, BSD Xserver bắt đầu từ xinit
trên ttyv2 sẽ giữ ttyv2 làm ctty của nó!).