2010-03-25 9 views
1

У меня есть сигнал, который блокирует SIGINT и в основном говорит: «Извините, вы не можете бросить курить. \ П»Scanf с сигналами

Проблема заключается это может произойти во время зсапЕ.

Когда это происходит во время сканированияf, scanf берет в качестве printf.

Как я могу сделать printf, что приведет к тому, что scanf будет автоматически нажимать клавишу ввода. Мне все равно, что у меня плохой вклад. Я просто хочу программно завершить сканирование с помощью printf или что-то еще.

Процесс:

зсап ("получить материал") -> Пользователь может ввести материал в

-> SIGINT происходит и идет к моему обработчику..

-> Хендлер говорит «Бла-бла-бла» для стандартного вывода.

-> Scanf взял этот бла-бла-бла и ждет большего ввода.

Как сделать так, чтобы при возврате scanf был закончен (все равно, что он собрал, я просто хочу, чтобы он продолжался без помощи пользователя).

EDIT: если я посылаю два сигнала, то scanf завершается. Я хочу как-то подражать окончанию scanf.

+0

«Когда это происходит во время сканированияf, scanf принимает значение printf в качестве входа». это странное заявление, вы имели в виду это? Вы играли с файловыми дескрипторами или трубами, которые вы не объяснили? В обычном запуске C, stdin и stdout довольно удалены. – msw

+0

Я не уверен, что он идет в scanf, но если я введу данные в scanf после, он никогда не будет работать. Я не хочу, чтобы он возвращался к заявлению scanf вообще, и это моя проблема. – jreid42

ответ

1

Ваш вопрос предполагает, что вы в замешательстве - или, возможно, английский - это не ваш родной язык.

У меня есть сигнал, который блокирует 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) блокируется для длительности, и обработчик сигнала остается в силе. Если второе прерывание происходит во время первого запуска, второе удерживается до тех пор, пока первый обработчик не вернется (в этот момент обработчик будет повторно введен).

+0

Спасибо за усилие. Мои извинения. Уже очень поздно, и я попытался наполовину ответить на вопрос. Я решил это, удалив scanf и прибегнув к fgets. – jreid42

0

Не используйте scanf, поскольку его буфер или код повтора могут мешать. Если вы используете вызов read(2), он должен возвращать -1 с ошибкой EINTR. Scanf может увидеть эту ошибку и повторить чтение. Вы всегда можете просмотреть данные из сырого чтения.

Предполагается, что QNX совместим с POSIX для чтения, и у вас нет источника scanf для проверки.

+0

Проблема в том, что я использую функции, которые у меня нет выбора при использовании. Он совместим с POSIX. – jreid42

+0

Вы оказались на правильном пути. Я больше не использую scanf. Мне пришлось что-то использовать по этой линии, за исключением того, что я использовал fgets. – jreid42

+0

Не использовать scanf() - хорошая идея; использование fgets() намного более разумно в моем опыте. –