Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Hесколько вопросов по программированию под FreeBSD.   Oleg RooT   21 Feb 2001 13:50:04 
 Re: Hесколько вопросов по программированию под FreeBSD.   Alex Markov   22 Feb 2001 13:16:07 
 Re: Hесколько вопросов по программированию под FreeBSD.   Valentin Nechayev   22 Feb 2001 13:36:35 
 Re: Hесколько вопросов по программированию под FreeBSD.   Oleg RooT   23 Feb 2001 13:13:32 
 Hесколько вопросов по программированию под FreeBSD.   Alex Semenyaka   22 Feb 2001 13:57:06 
Архивное /ru.unix.bsd/9104436dccc9.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional