nixp.ru v3.0

21 января 2017,
суббота,
03:05:25 MSK

DevOps с компанией «Флант»
Longobard написал 27 февраля 2004 года в 21:38 (430 просмотров) Ведет себя как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.

Вопрос к UT: как в Insight отлаживать демонов? А то когда прога форкаецца и родитель делает exit (0); дебаггер с чистой вовестью заканчивает работу. Инит демона такой:

void daemon_init(const char * pname, int facility) {
  int i;
  pid_t pid;
  if ((pid = fork()) != 0)
    exit(0);
  setsid();
  signal(SIGHUP, SIG_IGN);
  if ((pid = fork()) != 0)
    exit(0);
  daemon_proc = 1;
  chdir("/");
  umask(0);
  for (i = 0; i < MAXFD; i++)
    close(i);
  openlog(pname, LOG_PID, facility);
}

Короче слизан подчитуюс со Стивенса (а нах изобретать велосипед :) ). Короче как мне дебажить потомка (демона)? А то делать постоянный флуд в логи уже запарило.

anonymous

Ну, вообще-то insight — это фронтэнд к gdb, так что вопрос туда. Что я вижу в Гугле, это вот это

http://www.linux.org/docs/ldp/howto/GCC-HOWTO/x501.html

и еще один не очень плохой совет не выходить в процессах, а отправлять их спать (sleep).

А вообще, не сталкивался… Может, кто другой знает?

Good Luck,

UT

Longobard

А зачем мне оставлять родительский процесс живым, если он больше нечего делать не должен? Какой смысл?

Теперь по теме. Спасибо UT. Теперь для тех кто с английским не в ладах разобраться хочет:

Надо вставить breakpoint на fork(), затем сделать return 0 (родитель завершит работу) и дебважить потомка. Такой вот кусок кода приведен в доке в качестве примера:

(gdb) list
1       #include 
2
3       main()
4       {
5         if(fork()==0) printf("child\n");
6         else printf("parent\n");
7       }
(gdb) break fork
Breakpoint 1 at 0x80003b8
(gdb) run
Starting program: /home/dan/src/hello/./fork
Breakpoint 1 at 0x400177c4
Breakpoint 1, 0x400177c4 in fork ()
(gdb) return 0
Make selected stack frame return now? (y or n) y
#0  0x80004a8 in main ()
    at fork.c:5
5         if(fork()==0) printf("child\n");
(gdb) next
Single stepping until exit from function fork,
which has no line number information.
child
7       }
no1sm

а можно и просто на время этот форк забить ….

Longobard

и будет у тебя без форка демон одназадачный :) Ну забивай. А может вообще на демона забить? Еще меньше гемора будет ;)

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.