Ваш вопрос предполагает, что вы в замешательстве - или, возможно, английский - это не ваш родной язык.
У меня есть сигнал, который блокирует SIGINT и в основном говорит: «Извините, вы не можете бросить курить. \ П»
То, что вы, возможно, является обработчик сигнала, который устанавливается в ответ на SIGINT. Кроме того, вы можете использовать функцию signal() для установки обработчика, но вы должны использовать функцию sigaction() 'стандарта POSIX, чтобы вместо этого установить обработчик.
Проблема в том, что это может произойти во время сканирования.
В контексте «это», предположительно, сигнал прерывания, введенный пользователем, который хочет остановить вашу программу. Будьте осторожны с тем, чтобы остановить людей, выходящих из программы с сигналом прерывания; если вы не позволите им это сделать, они станут более жестокими. Это может означать, что они будут генерировать SIGQUIT (и, возможно, базовый дамп); если вы также блокируете это, есть ряд других трюков, которые они могут попробовать, пока не доберутся до конечного «kill -9 pid», на который ваша программа не сможет реагировать.
Если это происходит во время сканированияf, scanf принимает в качестве значения printf.
Это запутанно ... вы предположительно это означаешь, что выход из «Е()» заявления (предположительно один, который говорит: «Вы не можете бросить курить»), затем рассматриваются в качестве вклада в ' зсапЕ() '? Это кажется невероятным ... Это потребует очень-очень странной настройки ввода-вывода процесса, и я все еще не уверен, что это может произойти.
Как я могу сделать printf, который заставит scanf в основном нажать клавишу ввода автоматически. Мне все равно, что у меня плохой вклад. Я просто хочу программно завершить сканирование с помощью printf или что-то еще.
Существует несколько возможностей - это частично зависит от используемого вами O/S (даже если это POSIX.) Я не использую 'scanf()'; Мне трудно контролировать. Если ваша система возобновляет чтение после того, как обработчик прерывания вернется, у вас будет трудное время. Однако иногда «scanf()» останавливается и возвращает количество обработанных элементов. Если «scanf()» у вас нет, то вам нужно подумать о том, чтобы вставить объект «sigsetjmp()» в функцию, которая просто вызывает «setjmp()», а затем вызывает вашу функцию, которая вызывает «scanf()») , Тогда ваш обработчик сигнала может использовать 'siglongjmp()', чтобы вернуться к этой промежуточной функции:
sigjmp_buf trap;
int intermediary(int argument)
{
if (sigsetjmp(trap) == 0)
{
function_calling_scanf(argument);
return 0; // Success
}
// Report failure
return -1;
}
Ваше описание продолжает:
процесса:
scanf("get stuff") -> User is able to enter stuff in.
-> SIGINT происходит и идет для моего обработчика.
-> Хендлер говорит «Бла-бла-бла» для стандартного вывода.
-> Scanf взял этот бла-бла-бла и ждет большего ввода.
Откуда вы знаете, что scanf прочитал «бла-бла-бла»? Мне кажется очень, очень маловероятным.
Как сделать так, чтобы при возврате scanf был завершен (все равно, что он собрал, я просто хочу, чтобы он продолжался без помощи пользователя).
sigsetjmp()
.
EDIT: если я посылаю два сигнала, то сканирование завершается. Я хочу как-то программным образом эмулировать окончание scanf.
Это то, что указывает на то, что вы используете 'signal()' для установки обработчика сигнала, а не 'sigaction()'. При использовании «signal()», когда происходит прерывание, обработчик сигнала устанавливается на значение по умолчанию. С помощью 'sigaction()' вы должны запросить это поведение; по умолчанию принимаемый сигнал (SIGINT) блокируется для длительности, и обработчик сигнала остается в силе. Если второе прерывание происходит во время первого запуска, второе удерживается до тех пор, пока первый обработчик не вернется (в этот момент обработчик будет повторно введен).
«Когда это происходит во время сканированияf, scanf принимает значение printf в качестве входа». это странное заявление, вы имели в виду это? Вы играли с файловыми дескрипторами или трубами, которые вы не объяснили? В обычном запуске C, stdin и stdout довольно удалены. – msw
Я не уверен, что он идет в scanf, но если я введу данные в scanf после, он никогда не будет работать. Я не хочу, чтобы он возвращался к заявлению scanf вообще, и это моя проблема. – jreid42