2015-02-15 1 views
0

Я пишу программу, где мне нужно поймать сигнал SIGINT, чтобы я мог убить дочерние процессы без выхода родительского процесса. Я могу убить дочерние процессы, отправив их SIGKILL.с использованием сигнала в c и возобновления с определенной точки в программе

Но после обработки сигнала основная программа возобновляется с того места, где она была остановлена. Я хочу, чтобы он возобновлялся из другого места. Например, скажем, у меня есть петля, и сигнал пойман где-то внутри цикла; после обработки сигнала я хочу, чтобы программа возобновлялась с начала цикла, а не на середине.

+0

В вашем примере, когда вы возобновляете обработку сигнала, вы можете использовать «продолжить» и инициализировать условие цикла. т. е. для while (i <порог) write continue; I = 0; – Gaston

ответ

-1

Это действительно плохая форма, чтобы поймать SIGINT и делать что угодно, кроме прекращения. Если вы хотите перехватить сигнал, чтобы вы могли убить детей, тогда вы должны сделать и выйти - не продолжать вашу программу в обычном режиме.

В вашем сигнальном обработчике установлен глобальный флаг, указывающий SIGINT, а затем изнутри цикла, проверить эту переменную и выполнить условную ветвь логики.

+1

Как справиться с 'setjmp()'? – alk

+0

Вместо того, чтобы возвращаться из обработчика, он мог выполнить 'longjmp()' чуть выше его цикла. Это * ДЕЙСТВИТЕЛЬНО * плохая идея, но иногда плохие идеи - единственный способ добиться чего-то. – user590028

+1

Также я знаю немало распространенных программ, которые при получении 'SIGINT' делают что-то еще, но заканчивают. – alk

2

Он заключается в характере асинхронных сигналов, что они могут перехватывать код в любое время.

Если в коде есть разделы, в которых такая перегрузка нежелательна, отключите сигналы для этих частей.

Во всех других разделах выполняются соответствующие проверки, чтобы определить, произошел ли перехват и соответствующим образом реагировать на код.