Thông số POSIX thực sự ngăn chặn các cược của nó trong đó Thiết bị đầu cuối kiểm soát có liên quan và do đó nó xác định:
- Thiết bị đầu cuối điều khiển
- Câu hỏi trong đó có thể có một số tệp đặc biệt đề cập đến thiết bị đầu cuối có nghĩa là không được giải quyết trong POSIX.1. Tên đường dẫn
/dev/tty
là từ đồng nghĩa với thiết bị đầu cuối kiểm soát được liên kết với một quy trình.
Đó là trong danh sách Định nghĩa - và đó là tất cả ở đó. Nhưng trong Giao diện thiết bị đầu cuối chung , một số người khác nói:
Một thiết bị đầu cuối có thể thuộc về một quá trình như thiết bị đầu cuối kiểm soát của nó. Mỗi quá trình của một phiên có một thiết bị đầu cuối kiểm soát có cùng một thiết bị đầu cuối kiểm soát. Một thiết bị đầu cuối có thể là thiết bị đầu cuối kiểm soát tối đa một phiên. Thiết bị đầu cuối kiểm soát cho một phiên được phân bổ bởi người lãnh đạo phiên theo cách xác định thực hiện. Nếu một nhà lãnh đạo phiên không có thiết bị đầu cuối kiểm soát và mở tệp thiết bị đầu cuối chưa được liên kết với phiên mà không sử dụng tùy chọn O_NOCTTY (xem open ()), thì đó có phải là thiết bị đầu cuối xác định liệu thiết bị đầu cuối có trở thành thiết bị đầu cuối điều khiển của phiên không lãnh đạo.
Thiết bị đầu cuối điều khiển được kế thừa bởi một tiến trình con trong lệnh gọi hàm fork (). Một quá trình từ bỏ thiết bị đầu cuối kiểm soát của nó khi nó tạo ra một phiên mới vớisetsid()
chức năng; các quy trình khác còn lại trong phiên cũ có thiết bị đầu cuối này khi thiết bị đầu cuối kiểm soát của chúng tiếp tục có thiết bị đầu cuối. Khi đóng bộ mô tả tệp cuối cùng trong hệ thống (có hoặc không có trong phiên hiện tại) được liên kết với thiết bị đầu cuối kiểm soát, không xác định được liệu tất cả các quy trình có thiết bị đầu cuối đó như thiết bị đầu cuối kiểm soát của chúng có dừng bất kỳ thiết bị đầu cuối kiểm soát nào không. Liệu và làm thế nào một nhà lãnh đạo phiên có thể yêu cầu thiết bị đầu cuối kiểm soát sau khi thiết bị đầu cuối kiểm soát đã bị từ bỏ theo cách này không được chỉ định. Một quy trình không từ bỏ thiết bị đầu cuối kiểm soát của nó chỉ bằng cách đóng tất cả các mô tả tệp được liên kết với thiết bị đầu cuối kiểm soát nếu các quy trình khác tiếp tục mở.
Có rất nhiều điều còn lại chưa được xác định - và thành thật mà nói tôi nghĩ nó có ý nghĩa. Mặc dù thiết bị đầu cuối là giao diện người dùng chính, nhưng trong một số trường hợp, nó cũng là một số thứ khác - như phần cứng thực tế, hoặc thậm chí là một loại máy in - nhưng trong nhiều trường hợp thực tế không có gì cả - giống như xterm
một trình giả lập . Thật khó để có được thông tin cụ thể ở đó - và tôi không nghĩ rằng dù sao thì nó cũng sẽ được Unix quan tâm, bởi vì các thiết bị đầu cuối làm được nhiều hơn so với Unix.
Dù sao, POSIX cũng khá iffy về cách ps
ứng xử nơi ctty có liên quan.
Có công -a
tắc:
- Viết thông tin cho tất cả các quá trình liên quan đến thiết bị đầu cuối. Việc triển khai có thể bỏ qua các nhà lãnh đạo phiên từ danh sách này.
Tuyệt quá. Lãnh đạo phiên có thể được bỏ qua. Điều đó không hữu ích lắm.
Và -t
:
- Viết thông tin cho các quá trình liên quan đến thiết bị đầu cuối được đưa ra trong danh sách thuật ngữ. Ứng dụng phải đảm bảo rằng danh sách thuật ngữ là một đối số duy nhất ở dạng
<blank>
danh sách hoặc được phân tách bằng dấu phẩy. Định danh thiết bị đầu cuối sẽ được cung cấp trong một định dạng xác định thực hiện .
... đó là một sự thất vọng khác. Nhưng nó tiếp tục nói điều này về các hệ thống XSI:
- Trên các hệ thống tuân thủ XSI, chúng sẽ được cung cấp ở một trong hai dạng: tên tệp của thiết bị (ví dụ
tty04
:) hoặc, nếu tên tệp của thiết bị bắt đầu bằng tty
, chỉ là mã định danh theo sau các ký tự tty
(ví dụ 04
:) .
Điều đó tốt hơn một chút, nhưng không phải là một con đường. Ngoài ra trên các hệ thống XSI còn có công -d
tắc:
- Viết thông tin cho tất cả các quy trình, ngoại trừ các nhà lãnh đạo phiên.
... ít nhất là rõ ràng. Bạn có thể chỉ định công -o
tắc utput cũng như với tty
chuỗi định dạng, nhưng, như bạn đã lưu ý, định dạng đầu ra của nó được xác định theo thực hiện. Tuy nhiên, tôi nghĩ rằng nó là tốt như nó được. Tôi nghĩ rằng - với rất nhiều công việc - các công tắc trên kết hợp với một số tiện ích khác có thể giúp bạn có một sân bóng khá tốt. Thành thật mà nói, tôi không biết khi nào / nó phá vỡ cho bạn như thế nào - và tôi không thể tưởng tượng được một tình huống sẽ xảy ra. Nhưng, tôi nghĩ có lẽ nếu chúng ta thêm fuser
và find
chúng ta có thể xác minh đường dẫn.
exec 2<>/dev/null
ctty=$(sh -c 'ps -p "$$" -o tty=' <&2)
sid=$(sh -c 'ps -Ao pid= -o tty=|
grep '"$ctty$"' |
grep -Fv "$(ps -do pid=)"' <&2)
find / -type c -name "*${ctty##*/}*" \
-exec fuser -uv {} \; 2>&1 |
grep ".*$ctty.*${sid%%"$ctty"*}"
Các /dev/null
công cụ chỉ để cho thấy rằng nó có thể hoạt động khi không có mạng con tìm kiếm nào có bất kỳ 0,1,2 nào được kết nối với ctty. Dù sao, đó là bản in:
/dev/pts/3: mikeserv 3342 F.... (mikeserv)zsh
Bây giờ ở trên có đường dẫn đầy đủ trên máy của tôi, và tôi tưởng tượng nó sẽ phù hợp với hầu hết mọi người trong hầu hết các trường hợp. Tôi cũng có thể tưởng tượng nó có thể thất bại. Nó chỉ là heuristic thô.
Điều này có thể thất bại vì nhiều lý do khác có thể, nhưng nếu bạn đang ở trong một hệ thống cho phép người lãnh đạo phiên từ bỏ tất cả các mô tả cho ctty và vẫn duy trì bên cạnh như thông số kỹ thuật cho phép, thì điều này chắc chắn sẽ không có ích. Điều đó nói rằng, tôi nghĩ rằng điều này có thể có được một ước tính khá tốt trong hầu hết các trường hợp.
Tất nhiên, điều dễ nhất để làm nếu bạn có bất kỳ mô tả nào được kết nối với ctty của bạn chỉ là ...
tty <&2
...hoặc tương tự.
ps
giải pháp này bao gồm hầu hết các hệ thống (vàwho
không giúp được gì nhiều hơnps
), có thể có thêm một chút mã để xử lý mã định danh một mình (như "04"). Tôi đã tự hỏi nếu có một giải pháp di động hơn nữa.