The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

callback-функция для прямого чтения состояния порта в FreeBSD. (serial port example raw select)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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; } }

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру