2012-01-27 11 views
8

可能性の重複:
Linux: Prevent a background process from being stopped after closing SSH clientfork()を使用して親プロセスと独立して子プロセスをデーモン化する方法は?

は、私は(Linuxボックス上で、通常はSSHから)、端末上でアクセスして対話するCプログラムを持っています。私は問題を解決しようとしていますが、ターミナル/ログアウトを閉じた後、プロセスはそれで終了します(プログラムは基本的にいくつかのオプションを要求し、それ以上の対話を必要とせずにビジネスを行っています。 SSHのログアウト後も引き続き実行されます)。

linuxでは 'screen'などのようにこれを避ける方法がありますが、画面のようなインストールされたパッケージに依存せずに、プログラムでCでやりたいのです。

これまでのところ、fork()はプロセスをデーモン化する標準的な方法であると理解しています。だから誰も私が上記のプロセスを実行できるようにするコードを完成させるのに役立つでしょうか?親の中

main() 
{ 

//Do interactive stuff 

signal(SIGCHLD, SIG_IGN); //stops the parent waiting for the child process to end 

if(fork()) 
exit(0); 
// and now the program continues in the child process 

私は、元のシェルを閉じ...と子供がその作業を続けてSSHのログアウトできるようになりました!

//Continue with processing data/whatever the program does (no input/output to terminal required) 
exit(0); 
+3

を使用してそれを無視してみてください。 http://stackoverflow.com/questions/285015/linux-prevent-a-background-process-from-being-stopped-after-closing-ssh-client –

+0

um、実行するときに 'nohup'を使用するだけですか?フォークは必要ありません。 –

+0

@ Brian、nohupはプログラムとやりとりすることはできません。そのコマンドラインのやりとり。 – user1166981

答えて

12

は親からプロセスを切り離すために:子供の中で

使用がsetsid()子プロセス上、それは新しいセッションでプログラムを実行します

sid = setsid(); 

の例をご覧くださいhttp://www.itp.uzh.ch/~dpotter/howto/daemonize


端末が閉じている場合でも、実行中のプログラムを維持する:

SIGHUPは、その制御端子が閉じているときのプロセスに送られる信号です。

は、すべての答えを読む

signal (SIGHUP, SIG_IGN); 
+0

はい、他の人がnohup-でプログラムを起動することを提案していますが、私が投稿したコードのコンテキスト内でこれをプログラム的に行う方法を提案できますか? – user1166981

+0

@Userシグナルを無視するシグナルハンドラをインストールすることができます。親プロセスではなく新しいプロセスでハンドラを登録してください。 http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html –

+0

よろしくお願いいたします。ありがとうございます。 – user1166981

関連する問題