Ключевые слова:serial, port, example, raw, select, (найти похожие документы)
Date: Wed, 21 Feb 2001 09:50:04 +0000 (UTC)
From: Oleg RooT <[email protected]>
Newsgroups: fido7.ru.unix.bsd
Subject: callback-функция для прямого чтения состояния порта в 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;
}
}