次のコードを参照してください。プロセスに関連付けられたターミナル名をCで確実に見つける方法は?
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("ttyname(0): %s\n", ttyname(0));
printf("ttyname(1): %s\n", ttyname(1));
printf("ttyname(2): %s\n", ttyname(2));
printf("ctermid(NULL): %s\n", ctermid(NULL));
/* Sleep for sometime so that we can manually run the ps command to
* see the terminal associated with the process. */
sleep(10);
return 0;
}
これをコンパイルして実行します。
$ gcc foo.c
$ ./a.out
ttyname(0): /dev/pts/3
ttyname(1): /dev/pts/3
ttyname(2): /dev/pts/3
ctermid(NULL): /dev/tty
別の端末では、ps
コマンドを実行して端末名を確認します。
$ ps -ef | grep a.out | grep -v grep
coder 1498 1473 0 19:19 pts/3 00:00:00 ./a.out
これまでのところすべてが良いです。私のプログラムは端末を正しく表示します。
しかし、stdin、stdout、およびstderrが次のようにリダイレクトされると、私のプログラムは端末情報を出力できません。別の端末で
$ ./a.out </dev/null> foo.txt 2> /dev/null
、私はps
を実行し、私は確かに/dev/pts/3
は、彼が処理withtに関連していることがわかります。
$ ps -ef | grep a.out | grep -v grep
coder 1536 1473 0 19:22 pts/3 00:00:00 ./a.out
しかし./a.out
終了した後、私はfoo.txt
で、その出力を確認し、私はこの情報が取り込まれ表示されません。
$ cat foo.txt
ttyname(0): (null)
ttyname(1): (null)
ttyname(2): (null)
ctermid(NULL): /dev/tty
標準入力時にttyname()
はどんな意味のある情報を提供していないので、stdoutとstderrがリダイレクトされるとctermid()
always returns /dev/tty
以来、私は確実にプロセスに対応する端末を決定するために何ができるのでしょうか?標準のUnixまたはLinuxシステムで動作するソリューションを理想的に探していますが、それが不可能な場合は、Linux固有のソリューションも問題ありません。
stdin/out/errを/ dev/nullにリダイレクトした後、それがまだ端末に接続されていると思いますか? – KevinDTimm
@KevinDTimmまだ端末に取り付けられているとは思わない。それは私の質問ではありません。私は、stdin、stdout、stderrがリダイレクトされたときに端末に接続されていないことを完全に認識しています。しかしプロセスはまだ端末に関連しています( 'ps'出力から見ることができます)。プロセスがまだ端末に関連付けられている場合、Cコードを使用してプロセス内からその端末名を取得するにはどうすればよいですか?これは私の質問です。 –
Gotcha - checking – KevinDTimm