Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxシステムのバックグラウンドデーモン

Linuxシステムのバックグラウンドデーモン

  
は、Linuxの普及に伴い、誰もがLinuxでたくさんのプログラムを書いていると信じています。特に、一部のサーバープログラムはゆっくりとLinuxに転送されます。誰もが自分自身のプロセスをデーモンにし、システムの起動時に実行し、そして常にバックグラウンドプロセスにする方法です。以下のようなプログラムを書いてください。ソースコードは次のとおりです。
////////////////////////////////////初期init_daemon.c開始//////////////////////////////////////////////////////////////////////////////////////////////Br> #include
#include
/************************************* ********************************
*ファイル名:init_daemon.c
*目的:バックグラウンドプロセスを生成する
*作成者:zhoulifa周到
* date time:2006-03-10 01:00:00
*おかげで:北京工科大学Xiaohu

*注:誰でもあなたはもちろんあなたの商業的使用を含めて、コードをコピーして使用することができます
*しかし、GPLに従ってください。*********************** ******************************************* /
void Init_daemon(void)
{
int pid;
int i;} if(pid = fork())
exit(0); //親プロセスであり、親プロセスを終了する
>それ以外の場合(pid< 0)
exit(1); //forkが失敗し、exit
//が最初の子プロセスである場合、バックグラウンドで実行が継続されます。
setsid(); //最初の子プロセスは次のようになります。新しいセッションリーダーおよびプロセスリーダー
//if(pid = fork())
exit(0); //が最初の場合プロセス、最初の子プロセスを終了

それ以外の場合(pid< 0)
exit(1); //forkが失敗し、exit
//が2番目の子プロセスであり、続行
////子プロセスはセッショングループの長さではなくなりました。(i = 0; i< NOFILE; ++ i)//開いているファイルディスクリプタを閉じます

close(i);
chdir(" /tmp";); //作業ディレクトリを/tmpに変更します。umask(0); //ファイル作成マスクをリセットします。戻り値;
}
/////////////////////////////////init_daemon.c終了/////////////////////////////////////////////////////
これはあなたのプログラムをデーモンにする汎用的な関数です。
これがテストプログラムです: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Br> /***************************************************** **********************
*ファイル名:daemontest.c
*目的:テストのバックグラウンドプロセス
*執筆者:zhoulifa周立< Br> * date time:2006-03-10 01:09:00
*おかげで:北京工科大学Xiaohu
*注:誰でもコードをコピーしてあなたのビジネスを含むコードを使用することができます。

*しかしGPLに従ってください。******************************************** ******************************* /
void init_daemon(void); //デーモン初期化関数
Void signal_reload(int signal)
{
/* SIGUSR1シグナルを受け取ると、プログラムはすべてのパラメータを再インポートします。* /
FILE * fp;
time_t t;
if((fp = fopen) ( "test.log"、 "a"))> = 0)
{
t = time(0);
fprintf(fp、 "シグナルを受信しました(%d)、すべてのパラメータを%sで再読み込みしてください。signal、asctime(localtime(& t)));
f閉じる(fp);
}
/*パラメータの再インポート* /
} void signal_handle(int signal)
{
/*プログラムはSIGISR2シグナルを受信したときに終了する* /
FILE * fp;
time_t t;
if((fp = fopen(" test.log"、" a"))> = 0)
{
t = time(0);
fprintf(fp、 "シグナルを受信しました(%d)、%sで終了\\ n"、シグナル、asctime(localtime(& t)));
fclose(fp) int main(int argc、char ** argv)
{} FILE * fp;
time_t t; <);


exit(0);
} Br> init_daemon(); //Daemonに初期化します
signal(SIGCHLD、SIG_IGN); /*その後にサブプロセスが生成された場合、サブプロセス終了シグナルを無視します。
このシグナルが処理されない場合、エラーになります。子プロセスはゾンビプロセスを生成するために終了します* /
signal(SIGUSR1、signal_reload); /*リダイレクションパラメータsignalとして定義できるSIGUSR1シグナルを処理します* /
signal(SIGUSR2、signal_handle); /* SIGUSR2を処理しますシグナル、このシグナルを終了シグナルとして定義することができます。* /
while(1)//毎分test.logに実行状況を報告します
{
/*これが各プログラムの主要部分なので、 httpサービス、FTPサービスなどのように、以下で完成しました。* /
sleep(60); //1分間だけスリープする(if((fp = fopen(" test.log"、"))) > = 0)/* init_daemonではパスが/tmpに切り替えられているため、このファイルは/tmp/test.log*/となります。
{
t = time(0);
Fprintf(fp、「私は%sにいます\\ n」、asctime(localtime(& t)));
fclose(fp);
}
}
}
///////////////////////////////////daemontest.c end //////////////////////////////////////////////////
次のコマンドを使用してコンパイルします。
gcc init_daemon.c daemontest.c < Br> a.outなどのプログラムを生成する
このプログラムを実行することができます。 /a.out
システムの起動時にこのプログラムを自動的に実行したい場合は、/etc /rc.d /rc.localにsuコマンドを使用して1行追加することができます。次に例を示します。
su - Jacky -c" /bin /a.out"
このコマンドは、Jackyユーザーとして/bin/a.outプログラムを実行します。
プログラムの実行中にプログラムのパラメータを変更した場合は、必ずプログラムにパラメータを再インポートさせてください。プログラムのプロセス番号を表示するには、Psコマンドを使用します。 Grep a.out
次に、killコマンドを使用して、たとえば次のようにプログラムにパラメータを送信します。
kill -s SIGUSR1 11422
同様に、プログラムを終了する場合は、SIGUSR2シグナルをプログラムに送信します。
kill - s SIGUSR2 11422
zh-CN"],null,[1],zh-TW"]]]
Copyright © Windowsの知識 All Rights Reserved