Я пытаюсь отправить сигнал SIGINT в основной поток из какого-то другого потока. Основной поток назначил обработчик для сигнала. Когда я посылаю первый сигнал, он попадает в обработчик. Но я хочу посылать сигнал непрерывно. но после обработки первого сигнала программа завершается. Я поставил цикл while. Поэтому я ожидаю, что он должен продолжать отправлять эти сигналы. Ниже мой кодКак отправить сигнал SIGINT несколько раз
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static void catch_function(int signo) {
puts("Interactive attention signal caught.");
}
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
while(1)
{
Sleep(50);
puts("Raising the interactive attention signal.");
if (raise(SIGINT) != 0)
{
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
}
return 0;
}
int main(void)
{
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
HANDLE thread;
DWORD threadId;
thread = CreateThread(NULL, 0, &MyThreadFunction, NULL, 0, &threadId);
if(!thread)
{
printf("CreateThread() failed");
}
while(1)
{
Sleep(50);
}
puts("Exiting.");
return 0;
}
Выход следующего кода
Raising the interactive attention signal.
Interactive attention signal caught.
Raising the interactive attention signal.
Я попытался с помощью простого примера также. Здесь я посылаю сигнал 3 раза, но только первый раз сигнал пойман. После этого программа прекратилась. Ниже приводится код
#include <signal.h>
#include <stdio.h>
void signal_handler(int signal)
{
printf("Received signal %d\n", signal);
}
int main(void)
{
// Install a signal handler.
signal(SIGINT, signal_handler);
printf("Sending signal %d\n", SIGINT);
raise(SIGINT);
raise(SIGINT);
raise(SIGINT);
printf("Exit main()\n");
}
Выход
sending signal 2
Received signal 2
Так что я хочу знать, как я могу продолжать посылать некоторые сигналы из одного потока в какой-то другой поток? Я хочу, чтобы один из моих потоков отправил сигналы SIGINT, и main поймает их и выполнит некоторые действия соответственно.
Почему вы используете сигнал для * прерывания * в качестве сигнала «внимания»? Обычно это сигнал, отправленный при попытке отменить программу с помощью CTRL-C. Если вы поймаете его и у вас возникнет проблема с тем, что пользователь хочет прервать вашу программу, это будет невозможно, используя обычный стандартный способ. Вы можете использовать, например. 'SIGUSR1' или' SIGUSR2'. –
@JoachimPileborg Я хочу сделать это и для окон. Я думаю, что я не могу использовать SIGUSER1 и SIGUSR2 для этого. Пожалуйста, дайте мне знать, если я ошибаюсь. –
@JoachimPileborg можно посмотреть на http://stackoverflow.com/questions/31461171/signal-handler-getting-called-in-wrong-thread –