[英]What are the ways to find the session leader or the controlling TTY of a process group in Linux?
[英]How to figure out whether a Linux TTY is controlling a process group
所以我有一個tty(讓我們說/ dev / tty5)並且想要知道它當前是否是進程組或會話的控制tty,或者它是否當前是無主的。 POSIX有兩個API函數,它們在這里建議:tcgetpgrp()和tcgetsid(),這兩個函數只有在調用者將tty作為控制tty的情況下才有效 - 在這種情況下,它們使得它們幾乎無用(實際上我不是t看到tcgetsid()的重點。
任何人都有一個建議,我如何能夠以一種理智的方式從C中檢測終端當前是否是一個進程的控制終端? 我只關心Linux,所以如果需要特定於Linux的API,那對我來說沒問題。
BSD:int ioctl(int tty,TIOCGETPGRP,int * foreground_group);
Linux:int tcgetpgrp(int tty,int * foreground_group);
Linux只有在您擁有非自有終端的權限時才有效,即您是root用戶。 這是一種有意的安全實施。 BSD ioctl()允許任何tty將任何進程組(甚至是非遠程進程組)作為其前台tty。 POSIX只允許訪問具有tty作為其控制tty的進程組。 這種限制不允許在BSD ioctl中出現一些模糊和安全性破壞的情況。
你想做什么? 如果你是提供信號的內核,你應該只擔心過程控制tty。
編輯:我忘了/ proc
來自www.die.net:/ proc / [number] / fd這是一個子目錄,包含進程已打開的每個文件的一個條目,由其文件描述符命名,並且是實際文件的符號鏈接。 因此,0是標准輸入,1個標准輸出,2個標准誤差等。
執行此操作作為系統調用“ps au> tempfile.txt”,並解析該文件。
不確定這是否恰好滿足了您的需求,無論如何它是:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int status = system("fuser /dev/tty1 >/dev/null 2>/dev/null") >> 8;
printf("%s",
status ?
"tty not in use as a text terminal.\n" :
"tty in use as a text terminal.\n");
return 0;
}
如果您知道進程的PID,則可以使用proc文件系統來查詢進程的控制tty。
/ proc // fd / 0是指向tty的符號鏈接(比如/ dev / pts / 4)。
所以你需要做的就是用PID創建一個proc路徑(例如:/ proc / 7834 / fd / 0,其中7834是PID),然后調用readlink系統調用來獲取tty
請參閱下面的C代碼段
sprintf(procPath, "/proc/%s/fd/0", pid);
int ret = readlink(procPath, buffer, MAX_LEN);
buffer[ret] = '\0';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.