Почему может не работать такой фрагмент:
sigset_t mask;
sigprocmask(SIG_SETMASK, NULL, &mask); /* Get current signal mask */
sigdelset(&mask, sig_restart); /* Unblock the restart signal */
sigsuspend(&mask); /* Wait for signal */
Другой тред посылает kill-ом сигнал seg_restart (=32) данному, но
sigsuspend не разблокируется, как висел, так и висит.
libpthread 0.7, glibc 2.2.93.
У меня уже совсем лыжи не едут :(
Такая случилась историия: есть у меня процесс, видимый командой ps:
4980 pts/6 00:04:31 prog
Эта программа должна писать в файл "log" в бесконечном цикле "Hello!",
но процесс приостановлен, ничего не пишет.
Я компилирую и запускаю следующее:
#include <unistd.h>
int main() {
if(fork()==0) {
char * argv[] = {"prog",NULL};
execv(argv[0], argv);
}
return 0;
}
Это отрабатывает очень быстро, а я вижу на диске файл "log" с
несколькими тысячами слов "Hello!".
На диске в текущей директории и в PATH нет исполняемого файла с
именем "prog".
Кто бы мне объяснил такое поведение? Корректно ли оно?
В частности, поток должен приостановить (suspend) сам себя. Почему-то такой вызов: pthread_kill(pthread_self(), SIGSTOP) не работает. Где я не прав, и как нужно делать правильно?
Я нахожусь в каком-то треде - дочернем, там вызываю exit(), или _exit(), и моя прога подвисает, ожидая чего-то (вопрос номер один - чего она может ожидать?) Если вместо exit()/_exit() вызвать abort(), программа послушно абортается.
Если перед exit()/_exit() попытаться вызвать pthread_kill_other_threads(), результат тот же, до exit()/_exit() вообще не добираемся, ждем-с.
Кто бы подсказал, если кто имел дело с таким поведение, в чем тут может быть дело, и как можно бороться, а?