<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Сигналы и переходы jmp</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/8918.html</link>
    <description>Вашему вниманию несчастное универское задание:&lt;br&gt;&lt;br&gt;---&lt;br&gt;# Составить программу, которая заданное число раз (для определенности 5) через определенный временной интервал (5 сек.) повторяет на экране запрос, ожидающий стандартный ввод. Процесс должен завершаться в случае корректного ответа на запрос или после исчерпывания заданного числа запросов. При написании программы рекомендуется использовать средства обработки сигнала от таймера и средства нелокального перехода.&lt;br&gt;&lt;br&gt;Рекомендуется использовать системные вызовы alarm, signal, read и функции setjmp и localjmp. &lt;br&gt;---&lt;br&gt;&lt;br&gt;И вот приблизительное решение, которое напрашивается. по идее должно бесконечно задавать вопрос, делая перерывы по 5 сек:&lt;br&gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br&gt;#include &amp;lt;signal.h&amp;gt;&lt;br&gt;#include &amp;lt;setjmp.h&amp;gt;&lt;br&gt;#include &amp;lt;string.h&amp;gt;&lt;br&gt;&lt;br&gt;jmp_buf jmp;&lt;br&gt;&lt;br&gt;void pauser(int sig)&#123;&lt;br&gt;    printf(&quot;no time no time...&#092;n&quot;);&lt;br&gt;    sleep(5);&lt;br&gt;    longjmp(jmp,2);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;int main()&#123;&lt;br&gt;    char buf&#091;128&#093;;&lt;br&gt;    const char ask&#091;&#093; = &quot;I</description>

<item>
    <title>Сигналы и переходы jmp (guest)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/8918.html#3</link>
    <pubDate>Sat, 06 Nov 2010 13:15:30 GMT</pubDate>
    <description>&amp;gt; Рекомендуется использовать системные вызовы alarm, signal, read и функции setjmp и localjmp.&lt;br&gt;&lt;br&gt;Вам плохое рекомендуют.&lt;br&gt;Про longjmp из обработчика лучше забыть (он не восстановит статические переменные libc на момент вызова setjmp), в не учебных программах это может стать причиной больших и трудно отлавливаемых проблем.&lt;br&gt;Вместо signal лучше посмотрите на sigaction(2) вполне себе POSIX и не надо каждый раз заново переустанавливать обработчик.&lt;br&gt;printf(3) в обработчике использовать нельзя т.к. это не signal-safe функция. На некоторых *nix можно (v)s(n)printf() и syslog_r, а вот printf я не видел нигде. Список/Ссылка на него функций разрешенных к вызову из обработчика сигнала должен быть в man signal(2)&lt;br&gt;&lt;br&gt;&amp;gt;     char buf&#091;128&#093;;&lt;br&gt;&amp;gt;         read(0,buf,128);&lt;br&gt;&lt;br&gt;корректнее все-таки читать sizeof(buf)-1 байт.&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt; Но вот незадача, первый раз аларм сработал, снова выводится предложение ответить на&lt;br&gt;&amp;gt; вопрос и все, тишина) setjmp и alarm не дружат?&lt;br&gt;&lt;br&gt;setjmp не сохраняет маску сигналов (это верно не для всех систем, но</description>
</item>

<item>
    <title>Сигналы и переходы jmp (horse315)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/8918.html#2</link>
    <pubDate>Fri, 05 Nov 2010 08:13:13 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;     do&#123;&lt;br&gt;&amp;gt;         write(1, ask, strlen(ask));&lt;br&gt;&amp;gt;         read(0,buf,128);&lt;br&gt;&amp;gt;     &#125;while(strcmp(ans, buf)!=0);&lt;br&gt;&amp;gt;     exit(1);&lt;br&gt;&amp;gt; &#125;&lt;br&gt;&amp;gt; Поиграйся ещё, обобщи что существенно и напиши здесь, pls.&lt;br&gt;&amp;gt; Неприлично мешать printf и write, выбери что-то одно. Ещё - выбрось &#092;n,&lt;br&gt;&amp;gt; используй puts, так считается кошернее, читай с помощью fgets. При этом&lt;br&gt;&amp;gt; gets не годится, так как позволяет buffer overflow.&lt;br&gt;&lt;br&gt;ОО все роскошно, спасибо! снова я man не внимательно прочитал((&lt;br&gt;</description>
</item>

<item>
    <title>Сигналы и переходы jmp (ACCA)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/8918.html#1</link>
    <pubDate>Fri, 05 Nov 2010 07:28:06 GMT</pubDate>
    <description>Так работает:&lt;br&gt;&lt;br&gt;void pauser(int sig)&#123;&lt;br&gt;    printf(&quot;no time no time...&#092;n&quot;);&lt;br&gt;    siglongjmp(jmp,1);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;int main()&#123;&lt;br&gt;    char buf&#091;128&#093;;&lt;br&gt;    const char ask&#091;&#093; = &quot;Ioann IV sobriquet?&#092;n&quot;;&lt;br&gt;    const char ans&#091;&#093; = &quot;Grozniy&#092;n&quot;;&lt;br&gt;    signal(SIGALRM, pauser);&lt;br&gt;    sigsetjmp(jmp, SIGALRM);&lt;br&gt;    alarm(5);&lt;br&gt;    do&#123;&lt;br&gt;        write(1, ask, strlen(ask));&lt;br&gt;        read(0,buf,128);&lt;br&gt;    &#125;while(strcmp(ans, buf)!=0);&lt;br&gt;    exit(1);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Поиграйся ещё, обобщи что существенно и напиши здесь, pls.&lt;br&gt;&lt;br&gt;Неприлично мешать printf и write, выбери что-то одно. Ещё - выбрось &#092;n, используй puts, так считается кошернее, читай с помощью fgets. При этом gets не годится, так как позволяет buffer overflow.&lt;br&gt;</description>
</item>

</channel>
</rss>
