5

だから私は tty (/dev/tty5 としましょう) を持っていて、それが現在プロセス グループまたはセッションの制御 tty であるかどうか、または現在所有されていないかどうかを知りたいです。POSIX には、tcgetpgrp() と tcgetsid() という 2 つの API 関数があり、どちらも呼び出し元が tty を制御する tty を持っている場合にのみ機能します。 tcgetsid() の要点はまったくわかりません)。

端末が現在プロセスの制御端末であるかどうかを C から正常な方法で検出する方法を誰かが提案していますか? 私は Linux しか気にしていないので、Linux 固有の API が必要な場合は問題ありません。

4

4 に答える 4

1

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を持つプロセスグループへのアクセスのみを許可します。この制限により、BSDioctlに存在するあいまいでセキュリティを損なうケースが許可されなくなります。

あなたは何をしようとしているのですか?シグナルを配信するカーネルである場合にのみ、プロセス制御ttyについて心配する必要があります。

編集:/ procを忘れました
www.die.netから:/ proc / [number] / fdこれは、プロセスが開いているファイルごとに1つのエントリを含むサブディレクトリであり、ファイル記述子によって名前が付けられ、へのシンボリックリンクです。実際のファイル。したがって、0は標準入力、1は標準出力、2は標準エラーなどです。

于 2010-07-06T20:48:49.870 に答える
0

これをシステムコール「ps au >tempfile.txt」として実行し、ファイルを解析します。

于 2010-07-07T20:15:21.130 に答える
0

これがあなたのニーズを正確に捉えているかどうかはわかりませんが、とにかくここにあります:

#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;
}
于 2010-07-11T22:14:41.590 に答える
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';
于 2010-07-28T08:03:02.000 に答える