<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; сигналы в Linux]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=34815&amp;type=atom" />
	<updated>2014-05-08T12:11:32Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=34815</id>
		<entry>
			<title type="html"><![CDATA[Re: сигналы в Linux]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=408249#p408249" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>drBatty пишет:</cite><blockquote><p>Таким образом, родительский процесс может узнать, почему завершился дочерний процесс.</p></blockquote></div><p>Док, а &quot;зомби&quot;?<br />А вообще - спасибо за статью.</p>]]></content>
			<author>
				<name><![CDATA[ksuha]]></name>
				<uri>https://linuxforum.ru/profile.php?id=34050</uri>
			</author>
			<updated>2014-05-08T12:11:32Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=408249#p408249</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[сигналы в Linux]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=408215#p408215" />
			<content type="html"><![CDATA[<p>В Linux всё файлы.</p><p>Точнее почти всё. Есть ещё процессы. Процессом называют код в памяти, который выполняется процессором. В каждый момент времени может выполняться только один процесс(на одном физическом ядре CPU), но Linux умеет одновременно выполнять несколько процессов даже на одноядерном CPU. Для этого один процесс останавливается, и запускается другой.</p><p>Поэтому нужен какой то механизм обмена сообщениями между работающими процессами. Часто используются временные файлы, но это иногда не очень удобно. Потому есть ещё и <strong>сигналы</strong>.</p><p>Сигналом называется сообщение, которое один процесс может отправить другому. Обмен сигналами обеспечивается ядром GNU/Linux. В текущей реализации сигнал — небольшое целое число от 1 до 64. Числа не нужно запоминать, т.к. у каждого числа есть имя. Список сигналов можно посмотреть так:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">$ kill -l<br /> 1) SIGHUP&nbsp; &nbsp;&nbsp; 2) SIGINT&nbsp; &nbsp;&nbsp; 3) SIGQUIT&nbsp; &nbsp;&nbsp; 4) SIGILL&nbsp; &nbsp;&nbsp; 5) SIGTRAP<br /> 6) SIGABRT&nbsp; &nbsp;&nbsp; 7) SIGBUS&nbsp; &nbsp;&nbsp; <img src="https://linuxforum.ru/img/smilies/af.gif" alt="af" /> SIGFPE&nbsp; &nbsp;&nbsp; 9) SIGKILL&nbsp; &nbsp; 10) SIGUSR1<br />11) SIGSEGV&nbsp; &nbsp; 12) SIGUSR2&nbsp; &nbsp; 13) SIGPIPE&nbsp; &nbsp; 14) SIGALRM&nbsp; &nbsp; 15) SIGTERM<br />16) SIGSTKFLT&nbsp; &nbsp; 17) SIGCHLD&nbsp; &nbsp; 18) SIGCONT&nbsp; &nbsp; 19) SIGSTOP&nbsp; &nbsp; 20) SIGTSTP<br />21) SIGTTIN&nbsp; &nbsp; 22) SIGTTOU&nbsp; &nbsp; 23) SIGURG&nbsp; &nbsp; 24) SIGXCPU&nbsp; &nbsp; 25) SIGXFSZ<br />26) SIGVTALRM&nbsp; &nbsp; 27) SIGPROF&nbsp; &nbsp; 28) SIGWINCH&nbsp; &nbsp; 29) SIGIO&nbsp; &nbsp; 30) SIGPWR<br />31) SIGSYS&nbsp; &nbsp; 34) SIGRTMIN&nbsp; &nbsp; 35) SIGRTMIN+1&nbsp; &nbsp; 36) SIGRTMIN+2&nbsp; &nbsp; 37) SIGRTMIN+3<br />38) SIGRTMIN+4&nbsp; &nbsp; 39) SIGRTMIN+5&nbsp; &nbsp; 40) SIGRTMIN+6&nbsp; &nbsp; 41) SIGRTMIN+7&nbsp; &nbsp; 42) SIGRTMIN+8<br />43) SIGRTMIN+9&nbsp; &nbsp; 44) SIGRTMIN+10&nbsp; &nbsp; 45) SIGRTMIN+11&nbsp; &nbsp; 46) SIGRTMIN+12&nbsp; &nbsp; 47) SIGRTMIN+13<br />48) SIGRTMIN+14&nbsp; &nbsp; 49) SIGRTMIN+15&nbsp; &nbsp; 50) SIGRTMAX-14&nbsp; &nbsp; 51) SIGRTMAX-13&nbsp; &nbsp; 52) SIGRTMAX-12<br />53) SIGRTMAX-11&nbsp; &nbsp; 54) SIGRTMAX-10&nbsp; &nbsp; 55) SIGRTMAX-9&nbsp; &nbsp; 56) SIGRTMAX-8&nbsp; &nbsp; 57) SIGRTMAX-7<br />58) SIGRTMAX-6&nbsp; &nbsp; 59) SIGRTMAX-5&nbsp; &nbsp; 60) SIGRTMAX-4&nbsp; &nbsp; 61) SIGRTMAX-3&nbsp; &nbsp; 62) SIGRTMAX-2<br />63) SIGRTMAX-1&nbsp; &nbsp; 64) SIGRTMAX&nbsp; &nbsp; <br /></div><br />Этот список вообще говоря может быть разным в разных Linux&#039;ах.</p><p>Программы отправляют сигналы системной функцией kill(2), но сигналы можно отправлять и из терминала, командой <strong>kill</strong>(1).</p><p>Для отправки нужно обязательно знать PID (уникальный номер) процесса. Если сигнал не указать, команда kill отправляет сигнал <strong>SIGTERM</strong>, который у меня имеет номер 15. Получив такой сигнал программа аккуратно завершается, подчищая за собой ресурсы (закрывает рабочие файлы, удаляет временные, стирает с экрана свои окошки, и освобождает занятую память). Иногда этот сигнал не срабатывает. Тогда можно применить сигнал SIGINT, который эквивалентен CTRL+C (т.е. при нажатии в оболочке CTRL+C эта оболочка посылает SIGINT процессу), этот сигнал более жёсткий, нежели SIGTERM, и приложение завершается не корректно. Мусор за ним приходится чистить руками.</p><p>Особый сигнал это SIGKILL. Он НЕ доходит до приложения, а обрабатывается самим ядром. Приложение потому не может игнорировать и/или обрабатывать по своему сигнал SIGKILL.</p><p>Также есть команда killall, которая позволяет послать сигнал всем процессам с заданным именем.</p><p>Сигналы можно посылать только своим процессам, до чужих они не дойдут. Конечно root может посылать сигналы и чужим процессам.</p><p>PS: да, когда процесс завершается не как обычно(сам по себе), а по сигналу завершения(SIGINT/SIGTERM), то код возврата равен 128+сигнал. Например:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">drb@amilo:~$ sleep 1h<br />^C<br />drb@amilo:~$ echo $?<br />130<br /></div><br />130=128+2, 2 в моей системе SIGINT, а я нажал CTRL+C.</p><p>Таким образом, родительский процесс может узнать, почему завершился дочерний процесс.</p><p>Сигналы можно обрабатывать не только в программах на C и прочих нормальных ЯП, но и в bash скриптах, для этого есть ключевое слово trap, которое позволяет назначить свой обработчик для любого сигнала(кроме SIGKILL конечно) Подробнее man bash под спойлером<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>SIGNALS<br />&nbsp; &nbsp; &nbsp; &nbsp;When bash is interactive, in the absence of any traps, it ignores SIGTERM (so that kill 0 does<br />&nbsp; &nbsp; &nbsp; &nbsp;not&nbsp; kill an interactive shell), and SIGINT is caught and handled (so that the wait builtin is<br />&nbsp; &nbsp; &nbsp; &nbsp;interruptible).&nbsp; In all cases, bash ignores SIGQUIT.&nbsp; &nbsp;If&nbsp; job&nbsp; control&nbsp; is&nbsp; in&nbsp; effect,&nbsp; bash<br />&nbsp; &nbsp; &nbsp; &nbsp;ignores SIGTTIN, SIGTTOU, and SIGTSTP.</p><p>&nbsp; &nbsp; &nbsp; &nbsp;Non-builtin commands run by bash have signal handlers set to the values inherited by the shell<br />&nbsp; &nbsp; &nbsp; &nbsp;from its parent.&nbsp; When job control is not in effect, asynchronous commands ignore&nbsp; SIGINT&nbsp; and<br />&nbsp; &nbsp; &nbsp; &nbsp;SIGQUIT&nbsp; in addition to these inherited handlers.&nbsp; Commands run as a result of command substi-<br />&nbsp; &nbsp; &nbsp; &nbsp;tution ignore the keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.</p><p>&nbsp; &nbsp; &nbsp; &nbsp;The shell exits by default upon receipt of a SIGHUP.&nbsp; Before&nbsp; exiting,&nbsp; an&nbsp; interactive&nbsp; shell<br />&nbsp; &nbsp; &nbsp; &nbsp;resends&nbsp; the&nbsp; SIGHUP to all jobs, running or stopped.&nbsp; Stopped jobs are sent SIGCONT to ensure<br />&nbsp; &nbsp; &nbsp; &nbsp;that they receive the SIGHUP.&nbsp; To prevent the shell from sending the signal&nbsp; to&nbsp; a&nbsp; particular<br />&nbsp; &nbsp; &nbsp; &nbsp;job,&nbsp; it should be removed from the jobs table with the disown builtin (see SHELL BUILTIN COM-<br />&nbsp; &nbsp; &nbsp; &nbsp;MANDS below) or marked to not receive SIGHUP using disown -h.</p><p>&nbsp; &nbsp; &nbsp; &nbsp;If the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an<br />&nbsp; &nbsp; &nbsp; &nbsp;interactive login shell exits.</p><p>&nbsp; &nbsp; &nbsp; &nbsp;If&nbsp; bash&nbsp; is waiting for a command to complete and receives a signal for which a trap has been<br />&nbsp; &nbsp; &nbsp; &nbsp;set, the trap will not be executed until the command completes.&nbsp; When bash is waiting&nbsp; for&nbsp; an<br />&nbsp; &nbsp; &nbsp; &nbsp;asynchronous command via the wait builtin, the reception of a signal for which a trap has been<br />&nbsp; &nbsp; &nbsp; &nbsp;set will cause the wait builtin to return immediately with an exit status&nbsp; greater&nbsp; than&nbsp; 128,<br />&nbsp; &nbsp; &nbsp; &nbsp;immediately after which the trap is executed.</p></div></div><p>Зомби.</p><p>О них я как-то забыл. Впрочем, в них нет ничего интересного, кроме названия. Как я уже писал выше, завершённый процесс отдаёт родительскому код возврата, говорящий о том, как дочерний процесс завершился. Здесь кроется противоречие: процесса уже нет, а его код ещё есть. Для разрешения этого противоречия существует механизм &quot;зомби&quot;, процесс всё же завершается, но в таблице процессов&nbsp; его запись не стирается. Там и храниться код возврата, пока его не снимет родитель системной функцией <strong>wait</strong>(2).</p><p>Что-бы родитель обратил на это внимание, ядро отсылает ему сигнал SIGCHLD. Но если родитель не обращает внимание на сигнал, и не выполняет wait(2), то зомби так и висит до завершения родителя. Убить его нельзя, т.к. процесс-зомби уже завершён. Число процессов ограничено(его можно изменить bash командой ulimit), и лишние зомби могут сделать невозможной нормальную работу с системой. К счастью, это бывает только на кривом быдлокоде, когда программист запускает процессы, но забывает отслеживать их завершение. Т.ч. это больше для программистов.</p>]]></content>
			<author>
				<name><![CDATA[drBatty]]></name>
				<uri>https://linuxforum.ru/profile.php?id=86</uri>
			</author>
			<updated>2014-05-08T06:40:26Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=408215#p408215</id>
		</entry>
</feed>
