рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдирдХреНрд╕ рдбреЗрдореЙрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдкреНрд░рд┐рдп рд╣рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдбреЗрдорди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд░реВрдиреЗрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:


рджрд╛рдирд╡ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддред
рджрд╛рдирд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдорди 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 .

рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдбреЗрдореЙрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВред
рдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдбреЗрдорди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛ рдмрд┐рдВрджреБ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдВрдЧреЗ:
  1. рдбреЗрдореЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ред
  2. рдбреЗрдорди рдЯрд░реНрдорд┐рдиреЗрд╢рди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рдбреЗрдорди рдХреА рд╕рднреА рдореЙрдиреАрдЯрд░рд┐рдВрдЧ рдореЙрдирд┐рдЯрд░рдкрд╛рд░реНрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХреА рдЬрд╛рдПрдЧреАред рдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдпрд╛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реИред
рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:
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 .
рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреАрдЖрдИрдбреА тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреЛрдб:
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 .


рдХреЛрдб рдЖрдкрдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдпреЗ рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдореЙрди рдХреЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред

рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕рднреА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗред

рдмреЗрд╢рдХ, рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ рдЬреЛ рднрд╛рд░реА рдХрд╛рд░реНрдпрднрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдбреЗрдорди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рд╣реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИ, рд╕рд╛рде рд╣реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рдЪреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ (рдмреИрдХрдЯреНрд░реЗрд╕) рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ (рдХрд┐рд╕ рдлрдВрдХреНрд╢рди рдореЗрдВ) рд╣реБрдИ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕рдиреЗ рдмреБрд▓рд╛рдпрд╛ рдерд╛ред

рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:
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
рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрд┐рдЦреЗрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

Source: https://habr.com/ru/post/In129207/


All Articles