Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B%7%9%F%`%W%m%0%i%`!JBh(B5$B=5!K(B
[go: Go Back, main page]

$B%7%9%F%`%W%m%0%i%`!JBh(B5$B=5!K(B

$BEE;R!&>pJs9)3X7O(B
$BDI@n(B $B=$0l(B
<shui @ cs.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!$ http://www.coins.tsukuba.ac.jp/~syspro/2005/No5.html
$B%7%9%F%`%W%m%0%i%`$N%[!<%`%Z!<%8!J(B2005$BG/EY!K(B
http://www.coins.tsukuba.ac.jp/~syspro/2005/
$B$+$i$b%j%s%/$,D%$C$F$"$j$^$9!%(B

$B:#F|$NFbMF(B

$B%7%0%J%k(B

$B35MW(B

$B%W%m%;%9$O!$%*%Z%l!<%F%#%s%0%7%9%F%`$,%3%s%T%e!<%?!J%W%m%;%C%5!K$rCj>]2=$7!$;H$$$d$9$/$7$?$b$N$G$"$k!%(B $B%3%s%T%e!<%?$OF~=PNO5!4o$+$i$N%$%Y%s%HDLCN$r3d$j9~$_$H$$$&;EAH$_$G

$BF~=PNO5!4o(B

$B3d$j9~$_$OF~=PNO5!4o$+$i$N%$%Y%s%HDLCN$N$?$a$K9M$(=P$5$l$?$b$N$G$"$k!%(B $BF~=PNO5!4o$O%3%s%T%e!<%?$K(BI/O$B%3%s%H%m!<%i$rDL$7$F@\B3$5$l$F$$$k!%(B $B0J2<$N?^$OC1=c2=$7$?%3%s%T%e!<%?$N9=@.$r<($7$F$$$k!%(B

$B%3%s%T%e!<%?$N9=@.(B

$B%3%s%T%e!<%?$O!$$K2C$(!$%-!<%\!<%I!$%^%&%9!$%0%i%U%#%C%/%9%G%#%9%W%l%$!$(BHDD$B!$%M%C%H%o!<%/%$%s%?%U%'!<%9$J$I$NF~=PNO5!4o!J(BI/O$B%G%P%$%9!K$+$i$J$k!%(B $BF~=PNO5!4o$O(BI/O$B%3%s%H%m!<%i$rDL$7$F@)8f$5$l$k!%(B $B%W%m%;%C%5!$%a%$%s%a%b%j!$(BI/O$B%3%s%H%m!<%i$O%7%9%F%`%P%9$K@\B3$5$l$F$*$j!$%7%9%F%`%P%9$rDL$7$F$*8_$$$K%G!<%?$r$d$j

I/O$B%3%s%H%m!<%i$O!$%7%9%F%`%P%9$HF~=PNO5!4o$N4V$G%G!<%?$N66EO$7$r$9$k!%(B $BF~=PNO5!4o$OMM!9$JN$5$l$F$$$F$b!$$$$/$D$+$N0[$J$k%7%9%F%`%P%9$,;HMQ$5$l$F$$$k!%(B $BF~=PNO5!4o$NI8=`E*$J%$%s%?%U%'!<%9$KBP1~$9$k$h$&$K!$(BI/O$B%3%s%H%m!<%i$O%W%m%;%C%5$H$N%;%C%H$G;H$o$l$k$h$&$K3+H/$5$l$k!%(B

$B%7%9%F%`%P%9$O0J2<$N%P%9$+$i9=@.$5$l$k!%(B

$B%G!<%?$r%a%$%s%a%b%jKt$O(BI/O$B%3%s%H%m!<%i$+$il9g!$%W%m%;%C%5$O

$B%]!<%j%s%0$H3d9~$_(B

$B%W%m%;%C%5$O(BI/O$B%3%s%H%m!<%i$KF~=PNOMW5a$r=P$7!$(BI/O$B%3%s%H%m!<%i$O$=$NMW5a$r2rAw$7!$%W%m%;%C%5$O(BI/O$B%3%s%H%m!<%i$+$i$=$N7k2L$r

I/O$B=hM}$NN.$l(B

$B%W%m%;%C%5$O(BI/O$B%3%s%H%m!<%i$N>uBV$r%A%'%C%/$7B3$1$k$3$H$G!$=hM}$,=*N;$7$?$+$I$&$+$rCN$k!%(B $B=>$C$F!$%W%m%;%C%5$O!$(BI/O$B%3%s%H%m!<%i!$(BI/O$B%G%P%$%9$,%W%m%;%C%5$+$i$NF~=PNOMW5a$r=hM}$7$F$$$k4V$O!$%W%m%;%C%5$G$N=hM}$rB3$1$i$l$J$$$?$aBT$A;~4V$,$G$-$F$7$^$&!%(B $B$3$N$h$&$J(BI/O$B%G%P%$%9$X$NF~=PNOMW5a$N=hM}J}K!$r%]!<%j%s%0(B (Polling) $B$H8F$V!%(B

$BDL>o!$(BI/O$B%G%P%$%9$O%W%m%;%C%5$N=hM}B.EY$HHf3S$9$k$HHs>o$KCY$$$?$a!$%]!<%j%s%0$G(BI/O$B=hM}$N=*N;$rBT$C$F$$$k$H%W%m%;%C%5$N;HMQN($rCx$7$/2<$2$F$7$^$&!%(B $B$^$?!$Cl9g!$%W%m%;%C%5$,%f!<%6$+$i$NF~NO$rBT$D$h$&$J=hM}7ABV$G$O!$J#?t$NCo$KFq$7$$!%(B

$B3d$j9~$_(B (interrupt) $B$O!$%]!<%j%s%0$N;}$DHs8zN(@-$r2r7h$9$k$?$a!$F~=PNO=hM}$,=*N;$7$?$3$H$r%W%m%;%C%5$KBP$7DLCN$9$k$?$a$K9M$(=P$5$l$?J}K!$G$"$k!%(B I/O$B%3%s%H%m!<%i$O!$(BI/O$B%G%P%$%9$H$NF~=PNO=hM}$,=*N;$7$?$i!$%W%m%;%C%5$KBP$73d$j9~$_MW5a$r=P$9!%(B $B%W%m%;%C%5$O3d$j9~$_MW5a$r

$B3d$j9~$_$rMQ$$$?(BI/O$B=hM}$NN.$l(B

$B"#(B $B3d$j9~$_$O;~4V0MB8$N=hM}$r2DG=$K$9$k(B

$B3d$j9~$_$,9M$(=P$5$l$F$+$i!$;~4V$K0MB8$7$?=hM}$b$G$-$k$h$&$K$J$C$?!%(B $B;~4V$r9o$`%?%$%^%G%P%$%9$+$i0lDj<~4|$G!JNc$($P(B1$BIC$4$H$K!K3d$j9~$_$,$+$+$k$h$&$K$9$l$P!$$=$N%?%$%_%s%0$G%W%m%;%9$N@ZBX$r$7$?$j!$%]!<%j%s%0$r9T$C$?$j$9$k$3$H$,$G$-$k$h$&$K$J$k!%(B $B3d$j9~$_$K$h$j!$FCDj$N%W%m%;%9$dFCDj$N%G%P%$%9$K$+$+$j$-$j$K$J$k$3$H$J$/!$8xJ?$KM-8z$K%W%m%;%C%5$rJ,G[3hMQ$G$-$k$h$&$K$J$C$?!%(B

$B"#(B $B4X?t8F$S=P$7$OF14|=hM}!$3d$j9~$_$OHsF14|=hM}(B

$B3d$j9~$_=hM}$OK\Mh$N%W%m%0%i%`$N=hM}$NN.$l$H$OL54X78$K!$HsF14|E*(B (asynchronous) $B$KH/@8$9$k!%(B $B0lJ}!$4X?t8F$S=P$7$OF14|E*(B (synchronous) $B$G$"$j!$L@<(E*$K4X?t$r8F$S=P$7!$8F$S=P$5$l$?4X?t$G=hM}$,9T$o$l!$4X?t8F$S=P$7$+$iLa$C$F$/$k!%(B $B2

$BF14|=hM}$HHsF14|=hM}(B

$B$"$k4X?t$K$*$1$k=hM}$+$iJL$N4X?t!J3d$j9~$_=hM}%O%s%I%i$b%W%m%0%i%`$NCf$G$O4X?t$H$7$FDj5A$5$l$k!K$,8F$S=P$5$l$k$H$$$&=hM}$NN.$l$@$1$r8+$k$H!$4X?t8F$S=P$7$b3d$j9~$_=hM}$b0c$$$O$J$$!%(B $B$7$+$7$J$,$i!$4X?t8F$S=P$7$N>l9g$K$O4X?t$r8F$S=P$9$H$$$&L?Na$,F~$C$F$$$k$N$KBP$7!$3d$j9~$_=hM}$N>l9g$O3d$j9~$^$l$?%W%m%0%i%`$K$O3d$j9~$_=hM}%O%s%I%i$r8F$S=P$9$h$&$JL?Na$O0l@Z$J$$!%(B $B$$$D$I$3$G3d$j9~$^$l$k$+$o$+$i$J$$$N$,!$3d$j9~$_$NFCD'$G$"$k!%(B

OS$B%+!<%M%k$G=hM}$r9T$&$&$($G!$$$$D$G$b3d$j9~$^$l$F$7$^$&$N$G$O!$%G!<%?$N0l4S@-$rJ]$D$3$H$,$G$-$J$$$N$G!$%W%m%;%C%5$K$O3d$j9~$_$r6X;_$9$kL?Na$,MQ0U$5$l$F$$$k!%(B

$BNc30(B

$B3d$j9~$_$H$OJL$K!$%"%/%;%9$,5v2D$5$l$F$$$J$$HVCO$K%"%/%;%9$7$h$&$H$7$?$H$+!$(B0$B$K$h$k=|;;$r$7$h$&$H$7$?$H$+!$IT@5$JL?Na!JNc$($PFC8"$,I,MW$JL?Na!K$rl9g!$(BOS$B%+!<%M%k$NNc30%O%s%I%i$,5/F0$5$lBP=h$9$k!%(B

$B3d$j9~$_$HNc30$,NI$/;w$F$$$kE@$O!$(BOS$B%+!<%M%k$N3d$j9~$_Kt$ONc30%O%s%I%i$,5/F0$5$l$k$H$$$&E@!$$=$7$F$3$l$i$N%O%s%I%i$r8F$S=P$9L?Na$,%W%m%0%i%`Cf$K$O4^$^$l$F$$$J$$$H$$$&E@$G$"$k!%(B $B0[$J$C$F$$$k$N$O!$3d$j9~$_$N>l9g$O3d$j9~$_%O%s%I%i$,5/F0$5$l$k$N$O!$%G%P%$%9$J$I%W%m%0%i%`30It$NMW0x$G$"$k$N$KBP$7!$Nc30$N>l9g$O%W%m%0%i%`$N

$B%7%0%J%k(B

$B%O!<%I%&%'%"$+$i$N3d$j9~$_$O$dNc30$O(BOS$B%+!<%M%k$K$h$j=hM}$5$l$k!%(B $B%O!<%I%&%'%"$rD>@\A`:n$G$-$k$N$O(BOS$B%+!<%M%k$@$1$G$"$k$N$G!$DL>o$N%f!<%6%W%m%;%9$,%O!<%I%&%'%"$+$i$N3d$j9~$_$rD>@\l9g$b$"$k$,!$%W%m%0%i%`$K6&DL$9$k=hM}$bB?$$$?$a!$DL>o(BOS$B%+!<%M%k$K$h$j=hM}$5$l$k!%(B

$B$7$+$7$J$,$i!$3d$j9~$_$dNc30$N35G0$O%f!<%6%W%m%;%9$H$7$FF0:n$9$k%W%m%0%i%`$K$bJXMx$G$"$k!%(B $B$"$k0lDj;~4V$4$H$K3d$j9~$_$rH/@8$5$;$k$3$H$,$G$-$l$P!$8=:_$N=hM}$r7QB3$7$J$,$iJL$N=hM}!$Nc$($P%W%m%s%W%H$rE@LG$5$;$?$j!$%"%K%a!<%7%g%s$rl9g$K!$$=$N%$%Y%s%H$KBP$9$k%W%m%0%i%`FH<+$NBP=h$r$7$?$$>l9g$b$"$k!%(B

$B"#(B $B3d$j9~$_$rCj>]2=$7$?$N$,%7%0%J%k(B

UNIX$B$G$O%W%m%;%C%5$H%a%b%j$H$$$&4pK\E*$J%3%s%T%e!<%?$O%W%m%;%9$H$7$FCj>]2=$5$l$F$$$k$,!$F1$8$h$&$K3d$j9~$_5Z$SNc30$rCj>]2=$7$?$N$,%7%0%J%k(B (signal) $B$G$"$k!%(B $B3d$j9~$_%O%s%I%i$KAjEv$9$k$N$,%7%0%J%k%O%s%I%i$G$"$k!%(B $B0lHLE*$K;HMQ$5$l$k3d$j9~$_$dNc30$N$l$N%7%0%J%k$N

$B%W%m%;%930It$+$i$N%$%Y%s%H$H$7$FNI$/;HMQ$5$l$F$$$k$N$,!$%-!<%\!<%I$+$i(B Ctrl-C $B$d(B Ctrl-Z $B$K$h$k%W%m%;%9

$B%7%0%J%k$rMQ$$$?%W%m%0%i%_%s%0(B

$B%7%0%J%k$N
SIGNAL(7)           Linux Programmer's Manual           SIGNAL(7)

$BL>A0(B
       signal - $BM-8z$J%7%0%J%k$N0lMw(B

$B@bL@(B
       Linux $B$,%5%]!<%H$9$k%7%0%J%k$N0lMw$r0J2<$K<($9!#%7%0%J%kHV9f$N4v$D$+$O(B
       $B%"!<%-%F%#%/%A%c0MB8$G$"$k!#:G=i$K!"(BPOSIX.1$B$KDj5A$5$l$F$$$k%7%0%J%k$r<($9!#(B

       $B%7%0%J%k(B      $BCM(B      $BF0:n(B   $B%3%a%s%H(B
       --------------------------------------------------------------------------
       SIGHUP         1       A     $B@)8f$7$F$$$k%?!<%_%J%k(B(controlling terminal)
                                    $B$N%O%s%0%"%C%W$r8!=P$7$?!#$"$k$$$O!"@)8f$7$F(B
                                    $B$$$k%W%m%;%9(B(controlling process)$B$,;`$s$@!#(B
       SIGINT         2       A     $B%-!<%\!<%I$+$i$N3d$j9~$_(B(Interrupt)
       SIGQUIT        3       A     $B%-!<%\!<%I$K$h$kCf;_(B(Quit)
       SIGILL         4       A     $BITEv$JL?Na(B
       SIGABRT        6       C     abort(3)$B$+$i$NCfCG(B(Abort)$B?.9f(B
       SIGFPE         8       C     $BIbF0>.?tE@Nc30(B
       SIGKILL        9      AEF    Kill$B%7%0%J%k(B
       SIGSEGV       11       C     $BITEv$J%a%b%j;2>H(B
       SIGPIPE       13       A     $B%Q%$%WGK2u(B: $BFI$_

  • SIGQUIT, SIGILL: $B>e5-$O%^%K%e%"%k$+$i$NH4?h$G$"$k$,!$$b$H$N%^%K%e%"%k%Z!<%8$K0J2<$N4V0c$$$,$"$j!$(B SIGQUIT, SIGILL$B$N%G%U%)%k%H$NF0:n$O!V%W%m%;%9$N=*N;$H%3%"%@%s%W!W$G$"$k!%(B $B$7$+$7!$0J2<$N$h$&$K1Q8l$N%^%K%e%"%k%Z!<%8$K$O@5$7$$>pJs$,=P$F$$$k!%(B

       SIGQUIT       3        C      Quit from keyboard
       SIGILL        4        C      Illegal Instruction

$BF|K\8l$N%^%K%e%"%k%Z!<%8$N>pJs$O8E$+$C$?$j!$8mLu$G0UL#$,ITL@$G$"$C$?$j$9$k$3$H$,$"$k$?$a!$$=$N$h$&$J>l9g$O1Q8l$N%^%K%e%"%k%Z!<%8$r;2>H$9$Y$-$G$"$k!%(B $B1Q8l$N%^%K%e%"%k%Z!<%8$O0J2<$N$h$&$K$9$k$HI=<($5$;$k$3$H$,$G$-$k!%(B

% env LANG=C man 7 signal

signal $B%7%9%F%`%3!<%k(B

signal $B%7%9%F%`%3!<%k$O!$%7%0%J%k$r%5%]!<%H$9$k$?$a$K:G=i$K:n$i$l$?%7%9%F%`%3!<%k$G$"$k!%(B

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);

$B%7%0%J%k%O%s%I%i$rJQ99$9$k%7%0%J%k$H?7$7$$%7%0%J%k%O%s%I%i$r0z?t$K;XDj$7$F8F$S=P$9$H!$8E$$%7%0%J%k%O%s%I%i$,JV$5$l$k!%(B signal $B%7%9%F%`%3!<%k$N0z?t$HLa$jCM$N7?$O(B sighandler_t $B$G$"$j!$$3$l$O(B int $B7?$r0z?t$K

void signal_handler(int);

$B8E$$%7%0%J%k%O%s%I%i$NCM$H$7$F$O

  • SIG_IGN$B!!%7%0%J%k$NL5;k(B
  • SIG_DFL$B!!%G%U%)%k%H$NF0:n(B

    $B%7%0%J%k$H6&$K;H$o$l$k%7%9%F%`%3!<%k$K(B pause $B$,$"$k!%(B pause $B$r8F$S=P$9$H%7%0%J%k$r

    int pause(void);
    

    $B0J2<$O(B signal $B$H(B pause $B$r;H$C$?%W%m%0%i%`Nc$G$"$k!%(B

    • 6$B!A(B20$B9TL\!'%7%0%J%k%O%s%I%i$NDj5A!%(B3$B2s5/F0$9$k$H(B exit $B$r8F$V!%(B
    • 24$B9TL\!'(BSIGINT$B$KBP$9$k%7%0%J%k%O%s%I%i$H$7$F(B sigint_handler $B$r@_Dj(B
    • 30$B9TL\!'(Bpause $B$G%7%0%J%k$r $B$D$^$j!$(BCtrl-C $B$?$?$/EY$K(B sigint_handler $B$,5/F0$7!$(B3$B2s$?$?$/$H=*N;$9$k!%(B

           1  #include <stdio.h>
           2  #include <signal.h>
           3
           4  int sigint_count = 3;
           5
           6  void
           7  sigint_handler(int signum)
           8  {
           9          printf("sigint_handler(%d): sigint_count(%d)\n",
          10              signum, sigint_count);
          11
          12          if (--sigint_count <= 0) {
          13                  printf("sigint_handler: exiting ... \n");
          14                  exit(1);
          15          }
          16
          17  #if 0   /* For the original System V signal */
          18          signal(SIGINT, &sigint_handler);
          19  #endif
          20  }
          21
          22  main()
          23  {
          24          signal(SIGINT, &sigint_handler);
          25
          26          for (;;) {
          27                  printf("main: sigint_count(%d), calling pause ....\n",
          28                      sigint_count);
          29
          30                  pause();
          31
          32                  printf("main: return from pause. sigint_count(%d)\n",
          33                      sigint_count);
          34          }
          35  }
      

      $B%3%s%Q%$%k!$

      % ./a.out [$B
      main: sigint_count(3), calling pause ....
      [C-C]sigint_handler(2): sigint_count(3)
      main: return from pause. sigint_count(2)
      main: sigint_count(2), calling pause ....
      [C-C]sigint_handler(2): sigint_count(2)
      main: return from pause. sigint_count(1)
      main: sigint_count(1), calling pause ....
      [C-C]sigint_handler(2): sigint_count(1)
      sigint_handler: exiting ...
      %
      

      signal $B%7%9%F%`%3!<%k$N:G=i$N!J$7$+$7$J$,$i(B System V $B7O$N(B UNIX $B$^$G7Q>5$5$l$?!K;EMM$O!$B?$/$NLdBj$r;}$C$F$$$?!%(B

      1. $B%7%9%F%`%3!<%k$r8F$S=P$7%V%m%C%/$7$F$$$k;~$NF0:n!'(B

        $BNc$($P(B read $B%7%9%F%`%3!<%k$r8F$S=P$7!$F~NOBT$A$N>uBV$G%V%m%C%/$7$F$$$k;~$K!$%7%0%J%k$,DLCN$5$l$?>l9g!$%7%0%J%k$O=hM}$5$l!$$=$N%7%0%J%k$KBP1~$9$k%7%0%J%k%O%s%I%i$,5/F0$5$l$k!%(B $B$3$N>l9g!$%V%m%C%/>uBV$K$J$C$F$$$?%7%9%F%`%3!<%k$O%-%c%s%;%k$5$l(B EINTR $B$H$$$&%(%i!<$,JV$5$l$k$h$&$K$J$C$F$$$?!%(B

      2. $B%7%0%J%k%O%s%I%i$N%^%9%/$H%j%;%C%H!'(B

        $B$"$k%7%0%J%k$KBP1~$7$?%7%0%J%k%O%s%I%i$rl9g!$F1$8%7%0%J%k%O%s%I%i$r5/F0$7$F$7$^$&$H!$%G!<%?$N0l4S@-$J$I$KLdBj$,@8$8$F$7$^$&!%(B $B$=$N$?$a!$%7%0%J%k%O%s%I%i$O0lEY8F$S=P$5$l$k$H%G%U%)%k%H$NF0:n$K%j%;%C%H$5$l$k$h$&$K$J$C$F$$$?!%(B $B$=$N$?$a!$%7%0%J%k%O%s%I%i$,5/F0$5$l$kEY$K(B signal $B%7%9%F%`%3!<%k$G%7%0%J%k%O%s%I%i$r@_Dj$7D>$9I,MW$,$"$C$?!J>e5-%W%m%0%i%`$N(B17$B!A(B19$B9TL\!K!%(B

        $B$7$+$7$J$,$i!$$3$NJ}K!$G$O%G%U%)%k%H$NF0:n$,%W%m%;%9$N=*N;$G$"$C$?>l9g!$%7%0%J%k%O%s%I%i$r

        $B$=$3$G%7%0%J%k$rL5;k$9$k$h$&$K%7%0%J%k%O%s%I%i$N@hF,$G(B SIG_IGN $B$r@_Dj$9$l$PNI$$$h$&$K;W$o$l$k$,$,!$$3$N>l9g$O(B

        • $B%7%0%J%k%O%s%I%i$,5/F0$5$l(B signal $B%7%9%F%`%3!<%k$,8F$P$l(B SIG_IGN $B$,@_Dj$5$l$k$^$G$K$o$:$+$J$,$i7d4V$,$"$k(B
        • $BDLCN$5$l$?%7%0%J%k$OL5;k$5$l$F$7$^$&$?$a!$$=$N%7%0%J%k$rBT$D$D$b$j$G(B pause $B$r8F$V$H1J1s$K%V%m%C%/$7$F$7$^$&!$(B
        $B$H$$$&LdBj$,$"$k!%(B

      System V $B$H$OJL$N7ONs$N(BUNIX$B$K(BBSD (Berkeley Software Distribution) $B$H$$$&$b$N$,$"$C$?!%(B BSD UNIX$B$G$O>e5-$N$h$&$JLdBj$KBP$7(B signal $B$NF0:n$rJQ$($k$3$H$GBP1~$7$h$&$H$7$?!%(B

      1. $B%7%9%F%`%3!<%k$r8F$S=P$7%V%m%C%/$7$F$$$k;~$NF0:n!'(B

        $B%7%9%F%`%3!<%k$O%-%c%s%;%k$5$l$J$$!%(B $B%7%0%J%k%O%s%I%iuBV$KLa$k!K!%(B

      2. $B%7%0%J%k%O%s%I%i$N%^%9%/$H%j%;%C%H!'(B

        $B%7%0%J%k%O%s%I%i$N

      BSD UNIX$B$NJQ99$O5!G=$9$k$b$N$G$"$C$?$,!$(BSystem V UNIX $B$N8E$$(B signal $B$HF1$8(BAPI$B$rMQ$$$?$?$a!$:.Mp$N860x$H$J$C$?!%(B Linux $B$O$I$A$i$+$H$$$&$H(B System V $B$N(BAPI$B$r;}$C$F$*$j=i4|$N%P!<%8%g%s$G$O8E$$(B signal $B$N(BAPI$B$rDs6!$7$F$$$?$,!$8=:_$O(BBSD UNIX$B$N(B signal $B$N(BAPI$B$rDs6!$7$F$$$k!%(B $B$=$N$?$a>e5-%W%m%0%i%`$N(B17$B!A(B19$B9TL\$OITMW$K$J$C$F$$$k!%(B

      sigaction $B%7%9%F%`%3!<%k(B

      signal $B%7%9%F%`%3!<%k$N:.Mp>uBV$r2r7h$9$k$?$a$K!$(BPOSIX $B$G$O(B sigaction $B$H$$$&?7$7$$%7%9%F%`%3!<%k$rF3F~$7$?!%(B sigaction $B$GF3F~$5$l$?%7%0%J%k$N$3$H$r!$5lMh$N%7%0%J%k%a%+%K%:%`$H6hJL$9$k$?$a$K(BPOSIX$B%7%0%J%k$H8F$P$l$k$3$H$,$"$k!%(B POSIX$B=`5r$N%7%9%F%`$G$"$l$P(B sigaction $B$r;HMQ$9$Y$-$G$"$j!$(Bsignal $B$O$b$O$d;HMQ$9$Y$-$G$O$J$$!%(B

      int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
      

      sigaction $B%7%9%F%`%3!<%k$O!$Bh(B1$B0z?t$K%7%0%J%kHV9f!$Bh(B2$B0z?t$K@_Dj$9$k%7%0%J%k$NF0:n$r;XDj$7$F8F$S=P$9$H!$Bh(B3$B0z?t$K8E$$@_Dj$,JV$5$l$k!%(B

      $B>e5-$NLdBjE@$K$*$1$k(BPOSIX$B%7%0%J%k$N%G%U%)%k%H$NF0:n$O

    • $B%7%9%F%`%3!<%k$r8F$S=P$7%V%m%C%/$7$F$$$k;~$NF0:n!'(B

      $B8E$$(B signal $B$HF1$8$/!$%7%9%F%`%3!<%k$O%-%c%s%;%k$5$l(B EINTR $B$H$$$&%(%i!<$,JV$5$l$k!%(B

    • $B%7%0%J%k%O%s%I%i$N%^%9%/$H%j%;%C%H!'(B

      $B$3$NE@$D$$$F$O(BBSD UNIX$B$HF1$8$G$k!%(B $B%7%0%J%k%O%s%I%i$N $B$I$A$i$NE@$K$D$$$F$b!$@_Dj$K$h$j8E$$(B signal $BKt$O(B BSD UNIX $B$NF0:n$r$5$;$k$3$H$,$G$-$k$h$&$K$J$C$F$$$k!%(B

      $B%7%0%J%k$NF0:n$O0J2<$N(B struct sigaction $B$rMQ$$$F@_Dj$9$k!%(B

      struct sigaction {
              void (*sa_handler)(int);
              void (*sa_sigaction)(int, siginfo_t *, void *);
              sigset_t sa_mask;
              int sa_flags;
              void (*sa_restorer)(void);
      }
      

      • sa_handler$B!!%7%0%J%k%O%s%I%i(B
      • sa_sigaction$B!!$h$j>\$7$$%7%0%J%k>pJs$r0z?t$K sa_mask$B!!%7%0%J%k%O%s%I%i5/F0;~$K!$BP1~$9$k%7%0%J%k$NB>$K%^%9%/$7$?$$%7%0%J%k(B
      • sa_flags$B!!F0:n$N>\:Y$r@_Dj$9$k%U%i%0(B
      • sa_restorer$B!!%*%V%=%j!<%H!J;HMQ$7$F$O$$$1$J$$!K(B

      $B8E$$(B signal $B$N%W%m%0%i%`$r!$(Bsigaction $B$G(B sa_handler $B$r;H$&$h$&$KJQ99$9$k$H(B$B0J2<(B$B$N$h$&$K$J$k!%(B $B4pK\E*$K$OA4$/F1$8$G$"$k$,!$

    • 22$B9TL\!'%9%?%C%/>e$K 23$B9TL\!'%7%0%J%k%O%s%I%i$O(B sigint_handler
    • 24$B9TL\!'(Bsa_flags $B$K(B SA_RESTART $B$r@_Dj$7!$%7%0%J%k$K$h$jCfCG$5$l$?%7%9%F%`%3!<%k$N=hM}$O:F3+$9$k$h$&$K@_Dj(B
    • 26$B9TL\!'(Bsigaction $B$K$h$j%7%0%J%k$r@_Dj(B

         1  #include <stdio.h>
         2  #include <signal.h>
         3
         4  int sigint_count = 3;
         5
         6  void
         7  sigint_handler(int signum)
         8  {
         9          printf("sigint_handler(%d): sigint_count(%d)\n",
        10              signum, sigint_count);
        11
        12          if (--sigint_count <= 0) {
        13                  printf("sigint_handler: exiting ... \n");
        14                  exit(1);
        15          }
        16  }
        17
        18  main()
        19  {
        20          struct sigaction sa_sigint;
        21
        22          memset(&sa_sigint, 0, sizeof(sa_sigint));
        23          sa_sigint.sa_handler = sigint_handler;
        24          sa_sigint.sa_flags = SA_RESTART;
        25
        26          if (sigaction(SIGINT, &sa_sigint, NULL) < 0) {
        27                  perror("sigaction");
        28                  exit(1);
        29          }
        30
        31          for (;;) {
        32                  printf("main: sigint_count(%d), calling pause ....\n",
        33                      sigint_count);
        34
        35                  pause();
        36
        37                  printf("main: return from pause. sigint_count(%d)\n",
        38                      sigint_count);
        39          }
        40  }
    

    $B>e5-%W%m%0%i%`$Nl9g$HF10l$G$"$k$N$G!$>JN,!%(B

    $BF1$8%W%m%0%i%`$r!$(Bsigaction $B$G(B sa_sigaction $B$r;H$&$h$&$KJQ99$7$?%W%m%0%i%`$O0J2<$N$h$&$K$J$k!%(B

         1  #include <stdio.h>
         2  #include <signal.h>
         3  
         4  int sigint_count = 3;
         5  
         6  void
         7  sigint_action(int signum, siginfo_t *info, void *ctx)
         8  {
         9          printf("sigint_handler(%d): sigint_count(%d) signo(%d) code(0x%x)\n",
        10              signum, sigint_count, info->si_signo, info->si_code);
        11  
        12          if (--sigint_count <= 0) {
        13                  printf("sigint_handler: exiting ... \n");
        14                  exit(1);
        15          }
        16  }
        17  
        18  main()
        19  {
        20          struct sigaction sa_sigint;
        21  
        22          memset(&sa_sigint, 0, sizeof(sa_sigint));
        23          sa_sigint.sa_sigaction = sigint_action;
        24          sa_sigint.sa_flags = SA_RESTART | SA_SIGINFO;
        25  
        26          if (sigaction(SIGINT, &sa_sigint, NULL) < 0) {
        27                  perror("sigaction");
        28                  exit(1);
        29          }
        30  
        31          while (1) {
        32                  printf("main: sigint_count(%d), calling pause ....\n",
        33                      sigint_count );
        34  
        35                  pause();
        36  
        37                  printf("main: return from pause. sigint_count(%d)\n",
        38                      sigint_count );
        39          }
        40  }
    

    $B%3%s%Q%$%k!$pJs$r0z?t$H$7$F\:Y$K$D$$$F$O(B SIGACTION(2) $B$r;2>H!%(B

    % ./a.out [$B
    main: sigint_count(3), calling pause ....
    [C-C]sigint_handler(2): sigint_count(3) signo(2) code(0x80)
    main: return from pause. sigint_count(2)
    main: sigint_count(2), calling pause ....
    [C-C]sigint_handler(2): sigint_count(2) signo(2) code(0x80)
    main: return from pause. sigint_count(1)
    main: sigint_count(1), calling pause ....
    [C-C]sigint_handler(2): sigint_count(1) signo(2) code(0x80)
    sigint_handler: exiting ... 
    %
    
    $B%7%0%J%k$NL5;k(B
  • $Bl9g%7%0%J%k%O%s%I%i$K(B SIG_IGN $B$r@_Dj$9$k!%(B

         1  #include <stdio.h>
         2  #include <signal.h>
         3  
         4  int sigint_count = 3;
         5  
         6  main()
         7  {
         8          struct sigaction sa_ignore;
         9  
        10          memset(&sa_ignore, 0, sizeof(sa_ignore));
        11          sa_ignore.sa_handler = SIG_IGN;
        12  
        13          if (sigaction(SIGINT, &sa_ignore, NULL) < 0) {
        14                  perror("sigaction");
        15                  exit(1);
        16          }
        17  
        18          while (1) {
        19                  printf("main: sigint_count(%d), calling pause() ....\n",
        20                      sigint_count );
        21  
        22                  pause();
        23  
        24                  printf("main: return from pause().  sigint_count(%d)\n",
        25                      sigint_count );
        26          }
        27  }
    

    $B%3%s%Q%$%k!$

    % ./a.out [$B
    main: sigint_count(3), calling pause() ....
    [C-C][C-C][C-C][C-z]
    Suspended
    % jobs [$B
    [1]  + Suspended                     ./a.out
    % kill %1 [$B
    % [$B
    [1]    Terminated                    ./a.out
    

    $B0J2<$N$h$&$K!$(BSIG_IGN $B$NCM$O(B 1 $B$G$"$j!$$^$?%G%U%)%k%H$NF0:n$rI=$9(B SIG_DFL $B$NCM$O(B 0 $B$G$"$k!%(B sigaction $B$O8E$$@_Dj$rJV$9$,!$%7%0%J%k$rL5;k$^$?$O%G%U%)%k%H$N@_Dj$N>l9g$O!$$3$l$i$NCM$,(B sa_handler $B$KF~$C$F$/$k!%(B

    #define SIG_DFL ((__sighandler_t) 0)            /* Default action.  */
    #define SIG_IGN ((__sighandler_t) 1)            /* Ignore signal.  */
    

    kill

    $B%W%m%;%9$X%7%0%J%k$rAw$k$?$a$K$O(B kill $B%7%9%F%`%3!<%k$r;HMQ$9$k!%(B $B0z?t$KAw$j@h$N%W%m%;%9(BID$B$HAw$k%7%0%J%k$r;XDj$9$k!%(B

    int kill(pid_t pid, int sig);
    

    $B0J2<$O!$0z?t$K%W%m%;%9(BID$B$r;XDj$7!$$=$N%W%m%;%9$KBP$7(B SIGINT $B$rAw$k(B$B%W%m%0%i%`(B$B$G$"$k!%(B

         1  #include <stdio.h>
         2  #include <signal.h>
         3  #include <sys/types.h>
         4  
         5  main(int argc, char *argv[])
         6  {
         7          pid_t pid;
         8  
         9          if (argc != 2) {
        10                  printf("Usage: %s pid\n", argv[0]);
        11                  exit(1);
        12          }
        13  
        14          pid = atoi(argv[1]);
        15  
        16          if (pid <= 0) {
        17                  printf("Invalid pid: %d\n", pid);
        18                  exit(1);
        19          }
        20  
        21          if (kill(pid, SIGINT) < 0) {
        22                  perror("kill");
        23                  exit(1);
        24          }
        25  }
    

    $B%$%s%?!<%P%k%?%$%^(B

    $B$"$k0lDj;~4V$4$H$K3d$j9~$_$rH/@8$5$;!$8=:_$N=hM}$r7QB3$7$J$,$iJL$N=hM}!$Nc$($P%W%m%s%W%H$rE@LG$5$;$?$j!$%"%K%a!<%7%g%s$rl9g$K$O%$%s%?!<%P%k%?%$%^$H$$$&5!G=$r;HMQ$9$k!%(B $B%$%s%?!<%P%k%?%$%^$O(B setitimer $B%7%9%F%`%3!<%k$rMQ$$$F@_Dj$G$-$k!%(B

    int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
    

    $B%$%s%?!<%P%k%?%$%^$OBh(B2$B0z?t$G;XDj$7$?;~4V$,7P$D!J;D$j;~4V$,(B 0 $B$K$J$k!K$H%7%0%J%k$GDLCN$9$k$,!$$I$N$h$&$J;~4V$J$N$+$r!$Bh(B1$B0z?t$N(B which $B$G0J2<$N%?%$%^!<$+$i(B1$B$D$r@_Dj$9$k!%(B

    $BBh(B2$B0z?t$G;~4V$r;XDj$9$k$?$a$K;HMQ$9$k(B struct itimerval $B$H$=$NCf$G;H$o$l$F$$$k(B struct timeval $B$NDj5A$O0J2<$N$h$&$K$J$C$F$$$k!%(B

    struct itimerval {
        struct timeval it_interval; /* next value */
        struct timeval it_value;    /* current value */
    };
    
    struct timeval {
        long tv_sec;                /* seconds */
        long tv_usec;               /* microseconds */
    };
    

    it_value $B$,(B 0 $B$K$J$k$H!$(Bwhich $B$G;XDj$5$l$k%?%$%^$KBP1~$9$k%7%0%J%k$,DLCN$5$l$k!%(B $B$=$7$F!$(Bit_interval $B$KCM$,

    $B0J2<$O!$(BITIMER_REAL $B$G

         1  #include <stdio.h>
         2  #include <signal.h>
         3  #include <time.h>
         4  #include <sys/time.h>
         5  
         6  void alrm()
         7  {
         8          printf("alrm: %d\n", time(NULL));
         9  }
        10  
        11  main()
        12  {
        13          struct sigaction sa_alarm;
        14          struct itimerval itimer;
        15          int counter = 10;
        16  
        17          memset(&sa_alarm, 0, sizeof(sa_alarm));
        18          sa_alarm.sa_handler = alrm;
        19          sa_alarm.sa_flags = SA_RESTART;
        20  
        21          if (sigaction(SIGALRM, &sa_alarm, NULL) < 0) {
        22                  perror("sigaction");
        23                  exit(1);
        24          }
        25  
        26          itimer.it_value.tv_sec  = itimer.it_interval.tv_sec  = 1;
        27          itimer.it_value.tv_usec = itimer.it_interval.tv_usec = 0;
        28  
        29          if (setitimer(ITIMER_REAL, &itimer, NULL) < 0) {
        30                  perror("setitimer");
        31                  exit(1);
        32          }
        33  
        34          while (counter--) {
        35                  pause();
        36                  printf("main: %d\n", time(NULL));
        37          }
        38  }
    

    $B%3%s%Q%$%k!$

    % ./a.out [$B
    alrm: 1115995143
    main: 1115995143
    alrm: 1115995144
    main: 1115995144
    alrm: 1115995145
    main: 1115995145
    alrm: 1115995146
    main: 1115995146
    alrm: 1115995147
    main: 1115995147
    alrm: 1115995148
    main: 1115995148
    alrm: 1115995149
    main: 1115995149
    alrm: 1115995150
    main: 1115995150
    alrm: 1115995151
    main: 1115995151
    alrm: 1115995152
    main: 1115995152
    %
    

    $BN}=,LdBj(B

    $BN}=,LdBj!J#4#2!K(B

    kill $B%7%9%F%`%3!<%k$G%7%0%J%k$rAw$k(B$B%W%m%0%i%`(B$B$H%7%0%J%k$r$B%W%m%0%i%`(B$B$r;HMQ$7$F!$%W%m%;%9$+$i%W%m%;%9$X%7%0%J%k$,Aw$i$l$k$N$r3N$+$a$J$5$$!%(B

    $B%R%s%H!'C

    $BN}=,LdBj!J#4#3!K(B

    $BJ#?t$N0[$J$k%7%0%J%k$KBP$7%7%0%J%k%O%s%I%i$r@_Dj$7!$%7%0%J%k$K1~$8$?%7%0%J%k%O%s%I%i$,5/F0$5$l$k$3$H$r3N$+$a$J$5$$!%(B

    $BN}=,LdBj!J#4#4!K(B

    $BIT@5$J%a%b%j%"%/%;%9$O(B SIGSEGV $B$K$h$jDLCN$5$l$k!%(B $B$I$N%"%I%l%9$KBP$7$F%"%/%;%9$,$"$C$?$N$+$rI=<($9$k%W%m%0%i%`$r:n@.$7$J$5$$!%(B

    $B%R%s%H!'(BSIGACTION(2) $B$N(B siginfo_t $B$N>pJs$r;2>H!%(B

    $BN}=,LdBj!J#4#5!K(B

    sleep $B$O

    $B%R%s%H!'(Bsetitimer, sigaction, pause $B$r;HMQ$9$k!%(B

    $BN}=,LdBj!J#4#6!K(B

    $B%-!<%\!<%I$+$i(B1$BJ8;zF~NO$rFI$_9~$`4X?t(B getchar $B$K%?%$%`%"%&%H5!G=$rDI2C$7$?4X?t(B mygetchar $B$r:n$j$J$5$$!%(B mygetchar $B$O!$$"$k0lDj;~4VFb$K%-!

    $B%R%s%H!'(BSA_RESTART $B$O$I$&$$$&0UL#$+!)(B

    $BN}=,LdBj!J#4#7!K(B

    $BN}=,LdBj!J#2#9!K(B$B$HF1$8$h$&$K!$?F%W%m%;%9$H;R%W%m%;%9$,8r8_$KJ8;z$r=PNO$9$k%W%m%0%i%`$r!$%7%0%J%k$rMQ$$$F=q$-$J$5$$!%(B fork $B$G:n$k;R%W%m%;%9$O(B1$B$D$@$1$H$9$k!%(B