рдкреНрд░рд┐рдп рд╣рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдбреЗрдорди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд░реВрдиреЗрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:
- рдСрдЯреЛрд▓реИрдб рдореЗрдВ рдбреЗрдорди рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?
- рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдФрд░ рджрд╛рдирд╡ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?
- рдЕрдкрдиреЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдбреЗрдорди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ?
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
- рджрд╛рдирд╡ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддред
- рджрд╛рдирд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ
- рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗред
- рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдореБрджреНрджреЗред
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
- рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯред
- рджрд╛рдирд╡ рдирд┐рдЧрд░рд╛рдиреА рд╕рдорд╛рд░реЛрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯред
- рд╕рдорд╛рд░реЛрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ред
- рдХрдИ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпред
рджрд╛рдирд╡ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддредрджрд╛рдирд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдорди init.d рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдП рдЧрдП рд╣реИрдВ:
- рдбреЗрдореЙрди рдХреЛ рдЕрдкрдиреЗ рдкреАрдЖрдИрдбреА тАЛтАЛрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЙрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред
- рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ, рдбреЗрдореЙрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:
- рдирд┐рдпрдВрддреНрд░рдг рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЕрд▓рдЧ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордгред
- рдорд╛рддрд╛-рдкрд┐рддрд╛ (рдирд┐рдЧрд░рд╛рдиреА) рдФрд░ рд╡рдВрд╢рдЬ (рдбреЗрдорди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛): рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрдирд╛ред
- рдбреЗрдореЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ред
- рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ред
- рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЦрд╛рдХрд╛редрдпрд╣ рдХреЛрдб рдбреЗрдореЙрди рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред
int main( int argc, char ** argv)
{
int status;
int pid;
// ,
if (argc != 2)
{
printf( "Usage: ./my_daemon filename.cfg\n" );
return -1;
}
//
status = LoadConfig(argv[1]);
if (!status) //
{
printf( "Error: Load config failed\n" );
return -1;
}
//
pid = fork();
if (pid == -1) //
{
//
printf( "Error: Start Daemon failed (%s)\n" , strerror(errno));
return -1;
}
else if (!pid) //
{
//
// ,
//
umask(0);
// ,
setsid();
// , , .
//
chdir( "/" );
// //,
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
//
status = MonitorProc();
return status;
}
else //
{
// , .. ( )
return 0;
}
}
* This source code was highlighted with Source Code Highlighter .
рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- LoadConfig - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдХреЛрдб рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░реВрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо Printf рдФрд░ Scanf рдФрд░ рдХрдВрд╕реЛрд▓ I / O рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред
- рдбрд┐рд╕реНрдХ рдХреА рдЬрдбрд╝ рдореЗрдВ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдбрд┐рд╕реНрдХ рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛред рдпрджрд┐ рдбреЗрдореЙрди рдХрд╛ рд╡рд░реНрддрдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рдЙрд╕ рдбрд┐рд╕реНрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рддрдм рддрдХ рдирд╣реАрдВ рджреЗрдЧрд╛ рдЬрдм рддрдХ рдбреЗрдореЙрди рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
- рдореЙрдирд┐рдЯрд░рдкреНрд░реЛрдХ - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред
рдбреЗрдореЙрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВредрдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдбреЗрдорди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛ рдмрд┐рдВрджреБ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдВрдЧреЗ:
- рдбреЗрдореЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ред
- рдбреЗрдорди рдЯрд░реНрдорд┐рдиреЗрд╢рди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
рдбреЗрдорди рдХреА рд╕рднреА рдореЙрдиреАрдЯрд░рд┐рдВрдЧ рдореЙрдирд┐рдЯрд░рдкрд╛рд░реНрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХреА рдЬрд╛рдПрдЧреАред рдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдпрд╛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реИред
рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:
int MonitorProc()
{
int pid;
int status;
int need_start = 1;
sigset_t sigset;
siginfo_t siginfo;
//
sigemptyset(&sigset);
//
sigaddset(&sigset, SIGQUIT);
//
sigaddset(&sigset, SIGINT);
//
sigaddset(&sigset, SIGTERM);
//
sigaddset(&sigset, SIGCHLD);
//
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);
// PID'
SetPidFile(PID_FILE);
//
for (;;)
{
//
if (need_start)
{
//
pid = fork();
}
need_start = 1;
if (pid == -1) //
{
//
WriteLog( "[MONITOR] Fork failed (%s)\n" , strerror(errno));
}
else if (!pid) //
{
//
//
status = WorkProc();
//
exit(status);
}
else //
{
//
//
sigwaitinfo(&sigset, &siginfo);
//
if (siginfo.si_signo == SIGCHLD)
{
//
wait(&status);
//
status = WEXITSTATUS(status);
// ,
if (status == CHILD_NEED_TERMINATE)
{
//
WriteLog( "[MONITOR] Child stopped\n" );
//
break ;
}
else if (status == CHILD_NEED_WORK) //
{
//
WriteLog( "[MONITOR] Child restart\n" );
}
}
else if (siginfo.si_signo == SIGUSR1) //
{
kill(pid, SIGUSR1); //
need_start = 0; //
}
else // -
{
//
WriteLog( "[MONITOR] Signal %s\n" , strsignal(siginfo.si_signo));
//
kill(pid, SIGTERM);
status = 0;
break ;
}
}
}
// ,
WriteLog( "[MONITOR] Stop\n" );
// PID'
unlink(PID_FILE);
return status;
}
* This source code was highlighted with Source Code Highlighter .
рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- PID_FILE - рдПрдХ рд╕реНрдерд┐рд░ рдЬреЛ PID'a рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ /var/run/my_daemon.pid рд╣реИ
- WriteLog - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд▓реЙрдЧ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЖрдк рдЕрдкрдиреЗ рджрд┐рд▓ рдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣реАрдВ рднреА рдПрдХ рд▓реЙрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рд╡рд░реНрдХрдкреНрд░реЛрдХ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕реАрдзреЗ рдбреЗрдорди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреЛрдб:
void SetPidFile( char * Filename)
{
FILE* f;
f = fopen(Filename, "w+" );
if (f)
{
fprintf(f, "%u" , getpid());
fclose(f);
}
}
* This source code was highlighted with Source Code Highlighter .
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рдбреЗрдореЙрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╡рдВрд╢ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдЬреЛ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВред рдЕрдЧрд▓рд╛, рд╡рдВрд╢ рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
int WorkProc()
{
struct sigaction sigact;
sigset_t sigset;
int signo;
int status;
//
//
sigact.sa_flags = SA_SIGINFO;
//
sigact.sa_sigaction = signal_error;
sigemptyset(&sigact.sa_mask);
//
sigaction(SIGFPE, &sigact, 0); // FPU
sigaction(SIGILL, &sigact, 0); //
sigaction(SIGSEGV, &sigact, 0); //
sigaction(SIGBUS, &sigact, 0); // ,
sigemptyset(&sigset);
//
//
sigaddset(&sigset, SIGQUIT);
//
sigaddset(&sigset, SIGINT);
//
sigaddset(&sigset, SIGTERM);
//
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);
// -
SetFdLimit(FD_LIMIT);
// ,
WriteLog( "[DAEMON] Started\n" );
//
status = InitWorkThread();
if (!status)
{
//
for (;;)
{
//
sigwait(&sigset, &signo);
//
if (signo == SIGUSR1)
{
//
status = ReloadConfig();
if (status == 0)
{
WriteLog( "[DAEMON] Reload config failed\n" );
}
else
{
WriteLog( "[DAEMON] Reload config OK\n" );
}
}
else // - ,
{
break ;
}
}
//
DestroyWorkThread();
}
else
{
WriteLog( "[DAEMON] Create work thread failed\n" );
}
WriteLog( "[DAEMON] Stopped\n" );
//
return CHILD_NEED_TERMINATE;
}
* This source code was highlighted with Source Code Highlighter .
рдХреЛрдб рдЖрдкрдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- InitWorkThread - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕рднреА рдбреЗрдорди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдХрд╛рдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред
- рд╡рд┐рдзреНрд╡рдВрд╕ рдХрд╛рд░реНрдп рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдбреЗрдорди рд╡рд░реНрдХрд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред
- ReloadConfig - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ)ред рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рднреА рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпреЗ рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдореЙрди рдХреЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕рднреА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗредрдмреЗрд╢рдХ, рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ рдЬреЛ рднрд╛рд░реА рдХрд╛рд░реНрдпрднрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдбреЗрдорди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рд╣реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИ, рд╕рд╛рде рд╣реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рдЪреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ (рдмреИрдХрдЯреНрд░реЗрд╕) рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ (рдХрд┐рд╕ рдлрдВрдХреНрд╢рди рдореЗрдВ) рд╣реБрдИ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕рдиреЗ рдмреБрд▓рд╛рдпрд╛ рдерд╛ред
рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:
static void signal_error( int sig, siginfo_t *si, void *ptr)
{
void * ErrorAddr;
void * Trace[16];
int x;
int TraceSize;
char ** Messages;
//
WriteLog( "[DAEMON] Signal: %s, Addr: 0x%0.16X\n" , strsignal(sig), si->si_addr);
#if __WORDSIZE == 64 // 64
//
ErrorAddr = ( void *)((ucontext_t*)ptr)->uc_mcontext.gregs[REG_RIP];
#else
//
ErrorAddr = ( void *)((ucontext_t*)ptr)->uc_mcontext.gregs[REG_EIP];
#endif
// backtrace
TraceSize = backtrace(Trace, 16);
Trace[1] = ErrorAddr;
//
Messages = backtrace_symbols(Trace, TraceSize);
if (Messages)
{
WriteLog( "== Backtrace ==\n" );
//
for (x = 1; x < TraceSize; x++)
{
WriteLog( "%s\n" , Messages[x]);
}
WriteLog( "== End Backtrace ==\n" );
free(Messages);
}
WriteLog( "[DAEMON] Stopped\n" );
//
DestroyWorkThread();
//
exit(CHILD_NEED_WORK);
}
* This source code was highlighted with Source Code Highlighter .
рдмреИрдХрдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
[DAEMON] Signal: Segmentation fault, Addr: 0x0000000000000000
== Backtrace ==
/usr/sbin/my_daemon(GetParamStr+0x34) [0x8049e44]
/usr/sbin/my_daemon(GetParamInt+0x3a) [0x8049efa]
/usr/sbin/my_daemon(main+0x140) [0x804b170]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x126bd6]
/usr/sbin/my_daemon() [0x8049ba1]
== End Backtrace ==
рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ GetParamInt рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред GetParamInt рдлрд╝рдВрдХреНрд╢рди рдХреЛ GetParamStr рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдСрдлрд╕реЗрдЯ 0x34 рдкрд░ GetParamStr рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╢реВрдиреНрдп рдкрддреЗ рдкрд░ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреА рдЧрдИ рдереАред
рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдк рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдореВрд▓реНрдп (uc_mcontext.gregs рд╕рд░рдгреА) рдХреЛ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреИрдХрдЯреНрд░реЗрд╕ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рд╛рдордЧреНрд░реА рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде-рд╕рд╛рде-рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб constants CHILD_NEED_WORK рдФрд░ CHILD_NEED_TERMINATE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрд╡рдпрдВ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред
рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдореБрджреНрджреЗредрдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдЕрдзрд┐рдХрддрдо рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдХреЛрдИ рднреА рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓, рд╕реЙрдХреЗрдЯ, рдкрд╛рдЗрдк рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдирд╛ рдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдирд╛ рдпрд╛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдбреЗрдореЙрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЦреБрд▓реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 1024 рд╣реИред рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдиреЗрдЯрд╡рд░реНрдХ рдбреЗрдорди рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдЕрдзрд┐рдХ рдбрд╛рд▓реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
int SetFdLimit( int MaxFd)
{
struct rlimit lim;
int status;
// -
lim.rlim_cur = MaxFd;
// -
lim.rlim_max = MaxFd;
// -
status = setrlimit(RLIMIT_NOFILE, &lim);
return status;
}
* This source code was highlighted with Source Code Highlighter .
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдпредрдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рджрд╛рдирд╡ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдмреЗрд╢рдХ, рдХреЛрдб рд╕рд╣реА рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдПрдХ рдбреЗрдореЙрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд / рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ, рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ, init.d рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ред
рд╕реНрд░реЛрдд рдХреЛрдб рд▓рд┐рдВрдХ:
http://pastebin.com/jdX5wn0Eрд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрд┐рдЦреЗрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред