簡體   English   中英

如何確定Linux TTY是否正在控制進程組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM