5

2 つの質問:

1) プロセスがバックグラウンド プロセスとして呼び出されたかどうかを知るための Linux/Posix API はありますか?

linux> myprogram &

myprogramのコードは、バックグラウンドで実行するために呼び出されたことを (経由で) 検出できます&か?

2)フォアグラウンドプロセスとして開始された場合でも、プロセスをバックグラウンドで実行するための Linux/Posix API はありますか? IEは、実行時にシェルから何らかの形で「デタッチ」します..(シェルから完全にデタッチするか、シェルのバックグラウンドプロセスとして実行します)。

linux> myprogram
**** starting myprogram as a background job ****
linux>

myprogramシェルから切り離され、バックグラウンドで実行されているため、シェルプロンプトがすぐに返ってくるはずです

4

4 に答える 4

5

1) プロセスがバックグラウンドであるかどうかを知る方法は 2 つあります。

  1. シグナルハンドラーを持ち、シグナルSIGTTIN /SIGTTOUTハンドラー (stdin/stdout) に応じてノンブロッキングの読み取り/書き込みを行います。

  2. プロセスグループを確認し、端末のgetpgrp() == tcgetpgrp(STDOUT_FILENO)

プロセスはいつでもフォアグラウンドまたはバックグラウンドにできるため、チェックを繰り返す必要があります。

2)daemon処理をバックグラウンドにする機能があります。syslogデーモン化中にアプリケーションの出力をまたは他のファイルにリダイレクトすることをお勧めします。

if (daemonize) {
//redirect all prints to syslog or some other logfile
    daemon(0, 0);
}

アプリケーションがdaemonizeバックグラウンドに移行するかどうかの引数となる可能性があります。

于 2013-02-15T12:08:27.277 に答える
2

2番目の部分に答えるために、これは通常デーモンと呼ばれ、次のように構築されています。

main()
    pid = fork()
    if pid is child
          run program
    else we are the parent process
       exit to command prompt
于 2013-02-15T12:06:30.063 に答える
1

親シェル プロセスが中断されていない (待機中) 場合、プロセスはバックグラウンドにあります。これは PID で確認できます。

プロセスをバックグラウンドに置く (実行時にシェルからプロセスを完全に切り離す) には、daemon(3) 関数を使用します。

于 2013-02-15T12:09:15.647 に答える
0

tty(4)の man ページを読むことをお勧めします。私が理解していることから、バックグラウンドのプロセスには何もありません/dev/tty(そのためopen、そのファイルは失敗します)。

ioctlはTIOCNOTTY、呼び出しプロセスをその制御端末から切り離す必要があります。

isatty(3)関数に興味があるかもしれません(たとえば、 stdinまたはstdoutが端末であるかどうかを検出するため)。

于 2013-02-15T12:39:03.237 に答える