LINUX.ORG.RU

Линукс сигналы

 


0

2

приходит SIGINT - вызывается мой обработчик, но конкретная функция библиотечная не прерывается, при том что все остальные прерываются. как такое может быть?


А что за функция и как это проявляется? Библиотека своя или какая-то стандартная? Многопоточность есть?

Kiborg ★★★
()

А что делает твой обработчик ?

joy4eg ★★★★★
()

namespace mpi = boost::mpi;


volatile bool if_stop = false;
int rank;

void termination_handler(int signum)
{
(void) signum;
std::cout << «signal » << signum << ' ' << rank << std::endl;
if_stop = true;
}

void set_main_thread_signals_handler()
{
struct sigaction action;

memset(&action, 0, sizeof(action));
action.sa_handler = termination_handler;
if (sigemptyset (&action.sa_mask)) std::cout << «sigemptyset» << std::endl;
action.sa_flags = 0;
if (sigaction (SIGINT, &action, NULL) || sigaction (SIGTERM, &action, NULL) ||
sigaction (SIGUSR1, &action, NULL) || sigaction (SIGUSR2, &action, NULL) ||
sigaction (SIGHUP, &action, NULL)) std::cout << «sigaction» << std::endl;
}

int main()
{
mpi::environment env;
mpi::communicator world;

set_main_thread_signals_handler();
rank = world.rank();
if (world.rank() == 0) {
world.send(1, 0, std::string(«Hello»));
std::string msg;
std::cout << «start master» << std::endl;
sleep(100);
std::cout << «terminated master» << if_stop << std::endl;
} else {
std::string msg;
world.recv(0, 0, msg);
std::cout << «start slave» << std::endl;
world.recv(0, 0, msg);
std::cout << «terminated slave» << if_stop << std::endl;
}

return 0;
}

kasha
() автор топика

Компилирую: mpic++ test.cc -lboost_mpi -lboost_serialization
Запускаю: mpirun -np 2 ./a.out

Вывод:
start master
start slave

посылаю сигнал Сигинт, получаю:
C-c C-csignal 2 1
mpirun: killing job...

signal 2 0
terminated master1
signal 15 0
signal 15 1


world.recv(0, 0, msg);
std::cout << «terminated slave» << if_stop << std::endl;

функция recv не прерывается, хотя в обработчик заходит, пробовал изменять errno в обработчике, не помогает

kasha
() автор топика

Почитал бы как сигналы обрабатываются в многопоточных программах что ли для приличия, а потом уже спрашивал

anonymous
()

Самое веселое, то что обработчик вызывается, это скорее всего тебе повезло

anonymous
()
Ответ на: комментарий от kasha

воспользуйся тегом [code=cpp][/code] и почитай lorcode.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.