|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Oleg RooT 2:5020/400 21 Feb 2001 13:50:04 To : All Subject : Re: Hесколько вопросов по программированию под FreeBSD. --------------------------------------------------------------------------------
> > 4. Есть ли в эхотаге аналог callback-функций Windows для чтения
> > из порта? Если нет - какая функция позволяет узнать своё состояние
> > при работе с портом (чтение/ожидание данных) и позволяет корректно
> > прервать свою работу по сигналу?
>
> man select
Лучше poll, оно не ограниченно MAX_FD, как select.
а вообще вот кусок, с минимум коментариев:
fsignal() - извращенный обработчик сигналов
do_packet_loop() - основная работа демона (дописать)
say_error() - ну и так ясно...
void do_packet_loop()
{
while(1) ;
// здесь основной код демона...
}
int main(int argc,char** argv)
{
#ifndef DEBUG
openlog("XXXX",LOG_PID, LOG_USER);
#endif
if(setgid(65534))
sayerror("Unable to setgid. You must be \"root\" to do it");
if(setuid(65534))
sayerror("Unable to setuid. You must be \"root\" to do it");
if(chdir("/"))
sayerror("Unable to chdir");
//
#ifndef DEBUG
fclose(stdin);
fclose(stdout);
fclose(stderr);
if(fork())
exit(0); // 0 - success
setsid();
for(int j=1; j<32; j++)
signal(j,fsignal);
syslog(LOG_NOTICE,"XXXX daemon started");
#else
printf("XXXX daemon started\n");
#endif
do_packet_loop();
}
void sayerror(const char* s)
{
#ifdef DEBUG
syslog(LOG_NOTICE,s);
#else
puts(s);
#endif
exit(-1);
}
void fsignal(int sig)
{
switch(sig)
{
case SIGHUP:
syslog(LOG_NOTICE,"got SIGHUP. restarting...");
readconf();
break;
case SIGUSR1:
syslog(LOG_NOTICE,"got SIGUSR1. dumping user database...");
for (int i=0; i < nuser; i++)
syslog(LOG_NOTICE,"uin %d , ip %s",users[i].uin,
inet_ntoa(users[i].addr.sin_addr));
syslog(LOG_NOTICE,"done dumping user database");
break;
case SIGTERM:
case SIGINT:
case SIGQUIT:
syslog(LOG_NOTICE,"XXXXX daemon stopped on signal %d",sig);
closelog();
exit(0);
break;
default:
syslog(LOG_NOTICE,"got signal %d. ignore...",sig);
break;
}
}
--- ifmail v.2.15dev5
* Origin: MTU-Intel ISP (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/9104436dccc9.html, оценка из 5, голосов 10
|