4

Cでは、プログラムを検出する方法は「バックグラウンドモード」で呼び出されましたか?インタラクティブまたはバックグラウンドで起動したいプログラムがあります。

stdinから読み取ってはならず、「Stopped:ttyinput」状態で終了するべきではないことをどのように検出できますか?

stdinが閉じていることをテストする必要がありますか?どうやってやるの ?

編集:isattyは良い考えのようですが、stdinがパイプエンドであり、ttyではない場合はどうなりますか?

4

2 に答える 2

3

tcgetpgrp()制御端末のファイル記述子の関数(たとえば、STDIN_FILENOstdinの場合は0)を使用して、現在のフォアグラウンドプロセスグループが(からの)独自のプロセスグループと等しいかどうかを確認しますgetpgrp()。ただし、プログラムがフォアグラウンドとバックグラウンドの間で移動されるため、フォアグラウンドプロセスグループはいつでも変更される可能性があります。たとえば、電話をかけた直後tcgetpgrp()とテストする前に変更される可能性があります。したがって、これに基づいてアクションを実行する場合は、このことを念頭に置いてください。を回避するための信頼できる方法ではありませんSIGTTIN

#include <unistd.h>
pid_t fg = tcgetpgrp(STDIN_FILENO);
if (fg == -1) {
    /* stdin is not controlling terminal (e.g. file, pipe, etc.) */
} else if (fg == getpgrp()) {
    /* foreground */
} else {
    /* background */
}
于 2009-09-21T16:24:13.593 に答える
1

1) stdin が開いているかどうかを確認し、閉じている場合は /dev/null を開く必要があります。

2)isatty「descが端末に接続された開いているファイル記述子の場合は1を返し、それ以外の場合は0を返す」を使用できます

于 2009-09-21T16:14:13.367 に答える