QThreaded C ++ демон не завершает работу должным образом

0

Я написал программу Qt5/C++, которая виляет и работает в фоновом режиме, и останавливается в ответ на сигнал и обычно отключается. Все звучит здорово, но когда я "ps ax | grep myprog", я вижу, что все еще работает моя программа; например:

29244 ?        Ss   149:47 /usr/local/myprog/myprog -q
30913 ?        Ss     8:37 /usr/local/myprog/myprog -q
32484 ?        Ss     0:11 /usr/local/myprog/myprog -q

Если я запустил программу на переднем плане, процесс НЕ будет висеть в списке процессов - он погаснет, как ожидалось. Это происходит только в фоновом режиме. Зачем?


Обновление: я обнаружил, что моя программа находится в состоянии futex_wait_queue_me (queue_me и ждет пробуждения, таймаута или сигнала). У меня есть 3 отдельных потока - и это может быть связано. Поэтому я подключил отладчик к одному из ожидающих процессов и нашел это:

(gdb) bt
#0  0x000000372460b575 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00007f8990fb454b in QWaitCondition::wait(QMutex*, unsigned long) ()
   from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#2  0x00007f8990fb3b3e in QThread::wait(unsigned long) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#3  0x00007f8990fb0402 in QThreadPoolPrivate::reset() () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#4  0x00007f8990fb0561 in QThreadPool::waitForDone(int) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#5  0x00007f89911a4261 in QMetaObject::activate(QObject*, int, int, void**) ()
   from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#6  0x00007f89911a4d5f in QObject::destroyed(QObject*) () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#7  0x00007f89911aa3ee in QObject::~QObject() () from /opt/Qt/5.1.1/gcc_64/lib/libQt5Core.so.5
#8  0x0000000000409d8b in main (argc=1, argv=0x7fffba44c8f8) at ../../src/main.cpp:27
(gdb) 

Обновить:

Я прокомментировал свои 2 потока, так что теперь работает только основной поток, и проблема такая же.

Есть ли особый способ вызвать фоновый процесс для выхода? Почему не отключается основной поток?


Обновление: разрешено - Qt не нравится Fork. (См. Другой файл StackExchane). Мне пришлось перенести вилку на самый высокий уровень (до того, как Qt что-то делает), а затем Qt не виснет при выходе.

  • 1
    Пожалуйста, дайте детали вашего кода.
  • 3
    Это не зомби. У зомби будет Z где у вас есть Ss . Присоедините к ним отладчик и посмотрите, чего они ждут.
Показать ещё 1 комментарий
Теги:
qt
fork
qthread

1 ответ

2

ГОСУДАРСТВЕННЫЕ КОДЫ ПРОЦЕССА

Вот различные значения, которые будут отображать спецификаторы вывода s, stat и state (заголовок "STAT" или "S") для описания состояния процесса:

  D    uninterruptible sleep (usually IO)
  R    running or runnable (on run queue)
  S    interruptible sleep (waiting for an event to complete)
  T    stopped, either by a job control signal or because it is being traced.
  W    paging (not valid since the 2.6.xx kernel)
  X    dead (should never be seen)
  Z    defunct ("zombie") process, terminated but not reaped by its parent.

Для форматов BSD и когда используется ключевое слово stat, могут отображаться дополнительные символы:

  <    high-priority (not nice to other users)
  N    low-priority (nice to other users)
  L    has pages locked into memory (for real-time and custom IO)
  s    is a session leader
  l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
  +    is in the foreground process group.

Итак, ваши процессы все в "S: прерываемый сон". То есть, они все ждут блокировки системных вызовов.

Возможно, вам будут лучше намеки на то, что ждут ваши программы из этой команды:

$ ps -o pid,stat,wchan 'pidof zsh'
  PID STAT WCHAN
 4490 Ss   rt_sigsuspend
 4814 Ss   rt_sigsuspend
 4861 Ss   rt_sigsuspend
 4894 Ss+  n_tty_read
 5744 Ss+  n_tty_read
...

"wchan (ожидающий канал)" показывает функцию ядра (= ~ syscall), которая блокирует.

Смотрите также

  • 0
    Хорошо, я попробовал это, и я вижу, что myprog указан как "futex_wait_queue_me". возникли проблемы с поиском, что это значит. В моем приложении 3 потока - это означает, что поток все еще работает? (Я думал, что остановил их всех)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню