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%`!J(B2011$BG/EY(B1$B3X4|A0H>!K(B
[go: Go Back, main page]

$B%7%9%F%`%W%m%0%i%`!J(B2011$BG/EY(B1$B3X4|A0H>!K(B

$B%3%s%T%e!<%?%5%$%(%s%9@l96(B
$BDI@n(B $B=$0l(B

$BM}2r$r?<$a$k$?$a$K(B

$BL\

$BBh(B1$B=5(B
  1. $B9V5A%7%9%F%`%W%m%0%i%`$NL\E*(B
  2. $B%=%U%H%&%'%"$N9=@.$H%7%9%F%`%W%m%0%i%`(B
  3. $B%W%m%0%i%`$N
  4. $B%W%m%0%i%`$N3+H/4D6-(B
  5. $B%W%m%0%i%_%s%0$H%G%P%C%0(B
  6. $B%]%$%s%?!J#1!K(B
$BBh(B2$B=5(B
  1. $BJ8;z!$J8;zNs$N%G!<%?I=8=(B
  2. $BI8=`F~=PNO(B
  3. $BJ8;z!$J8;zNsA`:n%i%$%V%i%j(B
  4. $B%]%$%s%?!J#2!K(B
$BBh(B3$B=5(B
  1. $B%U%!%$%k%"%/%;%9(B
  2. $B%U%!%$%k%"%/%;%9!J1~MQ!K(B
  3. $B%]%$%s%?!J#3!K(B
  4. $B%P%C%U%!%*!<%P!<%U%m!<(B
$BBh(B4$B=5(B
  1. $B%W%m%;%9$N35G0$H5!G=(B
  2. $B%W%m%;%9$NA`:n!'%W%m%;%9:n@.!$%W%m%0%i%`
  3. $B%j%@%$%l%/%7%g%s!$%Q%$%W(B
  4. $B$=$NB>$N%W%m%;%9A`:n$N$?$a$N%7%9%F%`%3!<%k!$%i%$%V%i%j4X?t(B
$BBh(B5$B=5(B
  1. $B%7%0%J%k(B

$B9V5A%7%9%F%`%W%m%0%i%`$NL\E*(B

$B%7%9%F%`%W%m%0%i%`$G$O!$%f!<%6$NN)>l$+$i7W;;5!%7%9%F%`$d%*%Z%l!<%F%#%s%0%7%9%F%`$r$h$j?<$/M}2r$7!$3hMQ$G$-$k$h$&$K$J$k$?$a$N%W%m%0%i%_%s%0%9%-%k$N=,F@$rL\E*$H$9$k!%(B

$B%*%Z%l!<%F%#%s%0%7%9%F%`!J(BOS: Operating System$B!K$H$O(B

OS$B$O%O!<%I%&%'%"$N0c$$$r1#JC$7!$%f!<%6$,%W%m%0%i%`$r]2=$7$?35G0!J%"%V%9%H%i%/%7%g%s!K$rDs6!$9$k$3$H$G!$$$$m$$$m$J%3%s%T%e!<%?$G6&DL$K;HMQ$G$-$k

OS$B$NDs6!$9$k]35G0$H$7$F$O0J2<$N$b$N$,$"$k!%(B

$BCj>]35G0(B$B%O!<%I%&%'%"5!G=(B
$B%W%m%;%9(B$B%W%m%;%C%5!$%a%b%j(B
$B%U%!%$%k!$%G%#%l%/%H%j(B$B%9%H%l!<%8(B
$B%W%m%;%94VDL?.(B$B%3%s%T%e!<%?4V$NDL?.(B
$B%7%0%J%k(B$B3d$j9~$_(B
$B%"%/%;%9@)8f(B$B%3%s%T%e!<%?6&M-;~$NJ]8n(B

$B4pK\E*$JCj>]35G0$N9M$(J}$O$a$C$?$KJQ$o$k$3$H$O$J$$!%(B $Be5-$NCj>]35G0$O(B30$BG/0J>eJQ$o$C$F$$$J$$!%(B

OS$B$N!VFbIt$N;EAH$_!W$K$D$$$F$O(B2$B3X4|$N!V%*%Z%l!<%F%#%s%0!&%7%9%F%`(B I$B!W$H$$$&9V5A$G07$o$l$k!%(B $B$^$?!$(B3$B3X4|$N!V%*%Z%l!<%F%#%s%0!&%7%9%F%`(B II $B!W$d!VJ,;6%7%9%F%`!W$G$O!$$h$j9bEY$JOCBj$,07$o$l$k!%(B $BFbIt$N;EAH$_$NA0$K!$30$+$i8+$?>l9g$N(BOS$B$N9M$(J}!$;H$$J}$rM}2r$9$k$3$H$,%7%9%F%`%W%m%0%i%`$NL\E*$G$"$k!%(B

API$B!J(BApplication Program Interface$B!K$rMQ$$$?%W%m%0%i%_%s%0(B

OS$B$NDs6!$9$kCj>]35G0$N=89g$,!$%f!<%6$+$i8+$?>l9g$N%3%s%T%e!<%?$K$J$k!%(B $B$=$NCj>]E*$J%3%s%T%e!<%?$rA`:n$9$k$?$a$N%$%s%?%U%'!<%9$H$7$F(BAPI$B!J(BApplication Program Interface$B!K$,Ds6!$5$l$F$$$k!%(B API$B$rMQ$$$k$3$H$K$h$j!$Cj>]2=$5$l$?%3%s%T%e!<%?$rA`:n$9$k$3$H$,$G$-$k$h$&$K$J$k!%(B API$B$rDL$7$F!$%W%m%0%i%`$H$$$&

API$B$O0lHL$K(B

$B$K$h$jDs6!$5$l$k!%(B API$B$r;H$$$3$J$9$3$H$K$h$j!$%W%m%0%i%`$N@8;:@-!$?.Mj@-!$0BA4@-!$0\?"@-$r>e$2$k$3$H$,$G$-$k!%(B $B%W%m%0%i%_%s%08@8l$r<+A38@8l$HBPHf$7$F$_$k$H!$%W%m%0%i%_%s%08@8l<+BN$OJ8K!!$(BAPI$B$O8lWC$KAjEv$9$k$H9M$($i$l$k!%(B API$B$r3P$($k$3$H$K$h$j!$$o$+$j$d$9$/4J7i$JI=8=$,2DG=$K$J$k!%(B

$B$3$N9V5A$G$O(BUNIX (Mac OS X) $B$rMQ$$$F!$(BPOSIX (Portable Operating System Interface for UNIX) API$B$rMxMQ$7$F%W%m%0%i%`$r:n@.$9$k!%(B

$B;29M!'(BUNIX$B$,;H$o$l$F$$$k$H$3$m(B

$B%=%U%H%&%'%"$N9=@.$H%7%9%F%`%W%m%0%i%`(B

$B%W%m%0%i%`$N
$B%W%m%0%i%`$N<oN`(B

$B%7%9%F%`%W%m%0%i%`$G$O!$%i%$%V%i%j$d%7%9%F%`%3!<%k$rDL$7$F(BUNIX$B%+!<%M%k$rD>@\E*$KMxMQ$9$k!%(B

UNIX OS$B$N9=@.MWAG(B

OS$B$H$$$&8@MU$OMM!9$J0UL#$G;H$o$l$k!%(B $BMM!9$J%W%m%0%i%`$+$i9=@.$5$l$k(BOS$B4D6-$r0UL#$9$k>l9g$b$"$k$7!$(BOS$B%+!<%M%k$r0UL#$9$k>l9g$b$"$k!%(B $B0J2<$N?^$O0lHLE*$J(BUNIX$B4D6-$r9=@.$9$k%W%m%0%i%`$r<($7$F$$$k!%(B Mac OS X$B$N%M%$%F%#%V%&%#%s%I%&%7%9%F%`$O(BQuartz$B!$$^$?(BGUI$B$O(BAqua$B$H8F$P$l$k$b$N$G$"$k$,!$4pK\E*$JA4BN9=@.$OF1$8$G$"$k!%(B

UNIX OS$B$N9=@.MWAG(B

$B0J2

$B%7%'%k(B

UNIX$B%f!<%6$N%f!<%6%$%s%?%U%'!<%9$H$7$F:G$b$h$/;H$o$l$k%W%m%0%i%`$,%7%'%k!J(Bshell$B!K$G$"$k!%(B $B%7%'%k$O!$%f!<%6$N;kE@$+$i(BOS$B$r8+$?>l9g!$(BOS$B$rA`:n$9$k$?$a$K(BOS$B$r

$B%7%'%k$O(BCLI$B!J(BCommand Line Interface$B!K$rDL$7$F!$%f!<%6$+$i$N%3%^%s%I$ro$K6/NO$J%$%s%?%U%'!<%9$rDs6!$7$F$$$k!%(B

$B>pJs%7%9%F%`]35G0$NA`:n$,I,MW$G$"$k$?$a!$%7%9%F%`%W%m%0%i%`$N4pK\$r3X=,$9$k$?$a$NBj:`$H$7$F:GE,$G$"$k!%(B

X$B%&%#%s%I%&%7%9%F%`$H(BGUI$B!J(BGraphical User Interface$B!K(B

$B8=:_$N%f!<%6$,D>@\;HMQ$9$k%3%s%T%e!<%?$N$[$H$s$I$O(BGUI$B$rDs6!$7$F$$$k!%(B Mac OS X$B$d(BWindows$B$J$I$G$O(BGUI$B$O40A4$K(BOS$B$N0lIt$H$J$C$F$7$^$C$F$$$k!%(B

$B$=$NB>$N0lHLE*$J(BUNIX$B$G$O(BX$B%&%#%s%I%&%7%9%F%`$H%&%#%s%I%&%^%M!<%8%c$H$$$&FHN)$7$?%W%m%0%i%`$H$7$FDs6!$5$l$F$$$k!%(B X$B%&%#%s%I%&%7%9%F%`$O!$%S%C%H%^%C%W%G%#%9%W%l%$>e$K%&%#%s%I%&$rI=<($9$k$?$a$N4pK\E*$J5!G=$rDs6!$9$k$@$1$G$"$k!%(B $B%f!<%6$,%&%#%s%I%&$rA`:n$9$k$?$a$N(BGUI$B$O!$(BGNOME$B$d(BKDE$B$H$$$C$?%W%m%0%i%`72!J%G%9%/%H%C%W4D6-$H$b8F$P$l$k!K$K$h$jDs6!$5$l$k!%(B

$B%3%^%s%I!$%"%W%j%1!<%7%g%s(B

$B%3%^%s%I$H$O!$%f!<%6$,!J%7%'%k$rDL$7$F!K%3%s%T%e!<%?$KM?$($kL?Na$G$"$k!%(B UNIX$B$O!$%7%'%k$+$i;HMQ$9$k$3$H$N$G$-$kHs>o$KB?$/$N%3%^%s%I$rDs6!$7$F$$$k!%(B $B%3%^%s%I$O%7%'%k$H$OJL$N%W%m%0%i%`$G$"$k>l9g!J30It%3%^%s%I!K$b$"$k$7!$%7%'%k$KAH$_9~$^$l$F$$$k>l9g!JAH$_9~$_%3%^%s%I!K$b$"$k!%(B cd, set, umask, exit$B$H$$$C$?%7%'%k<+?H$N>uBV$rJQ99$9$k%3%^%s%I$d!$(Bhistory$B$J$I$N%7%'%k$,;}$D>pJs$rI=<($9$k%3%^%s%I$OAH$_9~$_%3%^%s%I$G$"$k!%(B $B$=$&$G$J$$%3%^%s%I$O!$DL>o30It%3%^%s%I$G$"$k!%(B

$B%3%^%s%I$H8F$V>l9g$H%"%W%j%1!<%7%g%s$H8F$V>l9g$KL@3N$J0c$$$,$"$k$o$1$G$O$J$$!%(B Office$B$d%S%G%*:F@8%W%m%0%i%`$N$h$&$J!$$=$l$@$1$GI,MW$J5!G=$rDs6!$9$k<+8J407kE*$J%W%m%0%i%`$r%"%W%j%1!<%7%g%s$H8F$V>l9g$,B?$$!%(B

$B%5!<%P!$%G!<%b%s(B

UNIX$B$G$O!$%P%C%/%0%i%&%s%I$GF0:n$7MM!9$J%5!<%S%9$rDs6!$9$kN"J}$GF/$/%W%m%0%i%`$N$3$H$r%G!<%b%s!J(Bdaemon$B!K$H8F$s$G$$$?$,!$:G6a$G$O%5!<%P$H8F$V$3$H$bB?$$!%(B $B%G!<%b%s$K$O!$%a%$%k$NG[?.$r$9$k%W%m%0%i%`!$%W%j%s%?$X$N=PNOMW5a$rCg2p$9$k%W%m%0%i%`!$%j%b!<%H%m%0%$%s$d%j%b!<%H%U%!%$%k%3%T!<$J$I$N%M%C%H%o!<%/5!G=$rDs6!$9$k%W%m%0%i%`$J$I$,$"$k!%(B

$B%7%9%F%`%3!<%k!$%i%$%V%i%j!$%_%I%k%&%'%"(B

UNIX$B$G%W%m%0%i%_%s%0$r$9$k>l9g!$%7%9%F%`%3!<%k!$%i%$%V%i%j!$%_%I%k%&%'%"$r;HMQ$7$F%W%m%0%i%`$r:n@.$9$k!%(B $B%7%9%F%`%3!<%k$O!$(BOS$B%+!<%M%k$N5!G=$rD>@\8F$S=P$9$?$a$N%$%s%?%U%'!<%9$G$"$k!%(B UNIX$B$N%7%9%F%`%3!<%k$O!$$G$-$k$@$1%7%s%W%k$K$J$k$h$&$K@_7W$5$l$F$$$k!%(B $B%i%$%V%i%j$H%_%I%k%&%'%"$O%W%m%0%i%`$NItIJ$H$J$k4X?t$N=89g$G$"$k!%(B $B%i%$%V%i%j$H%_%I%k%&%'%"$N0c$$$O!$%i%$%V%i%j$OMM!9$JL\E*$N%W%m%0%i%`$G6&DL$N5!G=$rDs6!$9$k$b$N$G$"$k$N$KBP$7!$%_%I%k%&%'%"$O%i%$%V%i%j$h$jFCDj$N%W%m%0%i%`!JNc$($P(BGUI$B!K$N6&DLItIJ$H$J$k$b$N$G$"$k!%(B $B$3$l$i$r$&$^$/;H$&$3$H$G!$3+H/8zN(!$?.Mj@-!$0BA4@-!$0\?"@-$,>e$,$j!$$^$?=PMh>e$,$C$?%W%m%0%i%`$bFI$_$d$9$/$J$j!$

$B%7%9%F%`%3!<%k$b%i%$%V%i%j$b!$(BC$B%W%m%0%i%`$+$i8F$S=P$9>l9g$O$I$A$i$b4X?t8F$S=P$7$N7ABV$G;HMQ$G$-$k$?$a!$F1$8$K8+$($k!%(B UNIX$B$N%^%K%e%"%k$G$O!$%7%9%F%`%3!<%k$O(B2$B>O!$%i%$%V%i%j$O(B3$B>O$KJ,N`$5$l$F$*$j!$%X%C%@ItJ,$K!V(BREAD(2)$B!W$N$h$&$K!V(B(2)$B!W$HIU$$$F$$$l$P(B2$B>O$N0UL#$G%7%9%F%`%3!<%k$G$"$j!$!V(BFREAD(3)$B!W$N$h$&$K!V(B(3)$B!W$HIU$$$F$$$l$P(B3$B>O$N0UL#$G%i%$%V%i%j$G$"$k!%(B

$B%W%m%0%i%`$H$N4X78$K$D$$$F$O!$%W%m%0%i%`!$%i%$%V%i%j!$%7%9%F%`%3!<%k$N4X78$G$h$j>\$7$/=R$Y$k!%(B

UNIX$B%+!<%M%k(B

UNIX$B%+!<%M%k$O!$%W%m%;%C%5$NFC8"%b!<%I$H$$$&%O!<%I%&%'%"$NA4$F$r@)8f$9$k$3$H$N$G$-$kF0:n%b!<%I$GF0:n$7!$D>@\%O!<%I%&%'%"$r@)8f$9$k%W%m%0%i%`$G$"$k!%(B UNIX$B%+!<%M%k$O!$%W%m%;%C%5$N5!G=$r;H$&$3$H$G!$J#?t%W%m%0%i%`$NF1;~$l$N%W%m%0%i%`!JKt$O%f!<%6!K$,%3%s%T%e!<%?$r@jM-$7$F$$$k$+$N$h$&$J88A[$rM?$($k!%(B UNIX$B4D6-$GFC8"%b!<%I$GF0:n$9$k%W%m%0%i%`$O%+!<%M%k$@$1$G$"$k!%(B $B$=$NB>$N%W%m%0%i%`$O!$%f!<%6%b!<%I$H$$$&%O!<%I%&%'%"$X$N%"%/%;%9$O@)8f$5$l$?4D6-$GF0:n$9$k!%(B

UNIX$B%+!<%M%k$O!$Bg$^$+$K8@$C$F%W%m%;%94IM}!$%U%!%$%k%7%9%F%`!$%a%b%j4IM}!$%M%C%H%o!<%/!$%W%m%;%C%50MB8It!$%G%P%$%9%I%i%$%P$+$i$J$k!%(B $B%U%!%$%k%7%9%F%`!$%M%C%H%o!<%/$OHf3SE*ItIJ2=$5$l$F$$$k$,!$A4BNE*$K$*8_$$$,4X78$7$"$C$FF0:n$9$kBg$-$J%W%m%0%i%`$G$"$k!%(B

$B%W%m%0%i%`!$%i%$%V%i%j4X?t!$%7%9%F%`%3!<%k$N4X78(B

$B%i%$%V%i%j4X?t$H%7%9%F%`%3!<%k$O!$F~=PNO5!G=$d$=$NB>$K$b$$$m$$$mJXMx$J5!G=$rDs6!$7$F$/$l$k$H$$$&E@$G!$%W%m%0%i%^$+$i8+$k$H;w$F$$$k$H$3$m$,$"$k!%(B $B$7$+$7!$%i%$%V%i%j4X?t$H%7%9%F%`%3!<%k$K$O!$$$$/$D$+Bg$-$J0c$$$,$"$k!%(B

$B%W%m%0%i%`!$%i%$%V%i%j!$%7%9%F%`%3!<%k$N4X78(B

$B>e$NNc$G$O!$(Bread $B$O%7%9%F%`%3!<%k$J$N$GD>@\%+!<%M%k$r8F$S=P$7$F$$$k!%(B strcmp $B$O%i%$%V%i%j$@$1$G5!G=$,

$B%W%m%0%i%`$N

$B%W%m%0%i%`$H%W%m%;%9$N4X78(B

$B0l8@$G8@$($P!$%W%m%0%i%`$r$C$F!$(B1$B$D$N%W%m%0%i%`$rJ#?t

$B%W%m%0%i%`$O!$(BCPU$B$,pJs$,F~$C$F$$$k!%(B
$B0lJ}!$%W%m%;%9$K$OpJs$,F~$C$F$$$k!%(B $BoJQ$o$i$J$$!K!%(B $B%W%m%0%i%`$K$O4^$^$l$F$$$J$$!$

$B%W%m%0%i%`$No%7%'%k$+$i9T$&!%(B $B%7%'%k$N%W%m%s%W%H$K%W%m%0%i%`$N%U%!%$%kL>$rBG$A9~$`$H!$$=$N%W%m%0%i%`$r

$B%W%m%0%i%`$H%W%m%;%9$N4X78(B

$B>e$NNc$O!$(BHDD (Hard Disk Drive) $B$K3JG<$5$l$F$$$k(B2$B$D$N%W%m%0%i%`(Bemacs$B$H(Bfirefox$B$r0[$J$kFs?M$N%f!<%6$,$l(B1$B$D$G$"$k$,!$F1$8%W%m%0%i%`$r

$B%W%m%;%9$N4Q;!(B

UNIX$B$K$O%W%m%;%9$r4Q;!$9$k$?$a$N%3%^%s%I$,$$$/$D$+MQ0U$5$l$F$$$k!%(B ps$B%3%^%s%I$O%W%m%;%9$N>uBV$rF@$k$?$a$N:G$bI8=`E*$J%3%^%s%I$G$"$j!$A4$F$N(BUNIX$B$G;HMQ$G$-$k!%(B pstree$B!$(Btop$B%3%^%s%I$O!$MQ0U$5$l$F$$$J$$(BUNIX$B%7%9%F%`$b$"$k$+$b$7$l$J$$!%(B

ps$B%3%^%s%I$O%*%W%7%g%s$K$h$jMM!9$J>pJs$rI=<($9$k$3$H$,$G$-$k!%(B

% ps [$B
  PID  TT  STAT	     TIME COMMAND
  603  p0  Ss	  0:00.33 -tcsh
  678  p2  Ss+	  0:00.07 -tcsh
% ps xu [$B
USER   PID %CPU %MEM	  VSZ	 RSS  TT  STAT STARTED	    TIME COMMAND
shui   599   0.1 -0.0	 30652	  520  ??  S	 5:34PM	  0:00.09 /usr/sbin/sshd -i
shui   603   0.0 -0.1	 31884	 1124  p0  Ss	 5:34PM	  0:00.33 -tcsh
shui   674   0.0 -0.0	 30652	  512  ??  S	 6:06PM	  0:00.02 /usr/sbin/sshd -i
shui   678   0.0 -0.0	 31848	  968  p2  Ss	 6:06PM	  0:00.08 -tcsh
shui   686   0.0 -0.6	 52136	11672  p2  S+	 6:07PM	  0:01.10 emacs -nw

top$B$O$?$/$5$s(BCPU$B;~4V$r;HMQ$7$F$$$k%W%m%;%9$N>uBV$r0lDj;~4V$*$-$KI=<($9$k!%(B

% top[$B
Processes:  54 total, 2 running, 52 sleeping... 147 threads	       18:20:22
Load Avg:  0.08, 0.03, 0.01	CPU usage:  3.7% user, 6.4% sys, 89.9% idle
SharedLibs: num =  178, resident = 44.4M code, 4.98M data, 8.95M LinkEdit
MemRegions: num =  6748, resident =  171M + 6.95M private,  114M shared
PhysMem:   159M wired,	165M active,  268M inactive,  593M used, 1.92G free
VM: 5.17G +  110M   43600(0) pageins, 0(0) pageouts

  PID COMMAND	   %CPU	  TIME	 #TH #PRTS #MREGS RPRVT	 RSHRD	RSIZE  VSIZE
  740 top	   7.6%	 0:01.95   1	19    22   572K	  440K	1.01M  27.0M
  686 emacs	   0.0%	 0:01.10   1	15    74  8.23M	 8.05M	11.4M  50.9M
  678 tcsh	   0.0%	 0:00.07   1	15    21   424K	  696K	 964K  31.1M
  674 sshd	   0.0%	 0:00.01   1	11    42   108K	 1.58M	 512K  29.9M
  672 sshd	   0.0%	 0:00.17   1	34    42   132K	 1.58M	1.43M  30.0M
  641 mdimport	   0.0%	 0:00.28   4	62   114   980K	 3.61M	2.96M  39.2M
  637 firefox-bi   1.4%	 1:36.66   3   285   699  59.9M	 45.6M	85.5M	391M
  634 LAServer	   0.0%	 0:01.92   1	59   146  21.6M	 20.5M	26.3M	300M
  627 Finder	   0.0%	 0:00.98   3   115   224  4.05M	 21.6M	12.6M	257M
  626 SystemUISe   0.0%	 0:01.46   2   244   237  3.04M	 14.8M	7.32M	248M
  625 Dock	   0.0%	 0:00.50   2	83   167   972K	 12.7M	10.5M	208M
  620 pbs	   0.0%	 0:00.13   2	40    96   696K	 3.57M	1.88M  53.7M
  614 CCacheServ   0.0%	 0:00.00   1	18    22   176K	 1.06M	 948K  27.5M
  603 tcsh	   0.0%	 0:00.36   1	15    23   568K	  696K	1.10M  31.1M
  599 sshd	   0.0%	 0:00.14   1	11    42   112K	 1.59M	 520K  29.9M
  597 sshd	   0.0%	 0:00.10   1	34    43   116K	 1.59M	1.39M  30.0M
  576 AppleVNCSe   0.0%	 0:00.02   1	29    34   376K	  916K	1.35M	155M
  575 ARDAgent	   0.0%	 0:00.27   6	90    92   992K	 5.94M	2.52M	204M
  565 WindowServ   0.0%	 0:21.21   2   157   311  3.83M	 23.9M	24.3M	213M
  563 loginwindo   0.0%	 0:00.58   3   125   170  1.74M	 4.20M	3.87M	201M
  368 rpc.lockd	   0.0%	 0:00.81   1	11    21   108K	  488K	 768K  26.7M
  367 rpc.statd	   0.0%	 0:00.00   1	11    19   144K	  384K	 240K	282M

$B%W%m%0%i%`$N3+H/4D6-(B

$B%^%K%e%"%k$NFI$_J}(B

% man $B%7%9%F%`%3!<%kL>(B [$B
% man $B%i%$%V%i%j4X?tL>(B [$B
% man $B%3%^%s%IL>(B [$B
% man -k $B%-!<%o!<%I(B [$B

$B%^%K%e%"%k$rI=<($9$k$K$O!$B>$K(B emacs $B$NCf$G$O(B ESC x man $B$HBG$A(B$B!$%b!<%I%i%$%s$K(B Manual Entry $B$HI=<($5$l$?$H$3$m$KI=<($7$?$$%7%9%F%`%3!<%k!$%i%$%V%i%j4X?t!$Kt$O%3%^%s%IL>$rBG$D$3$H$GI=<($9$k$3$H$,$G$-$k!%(B

$B%^%K%e%"%k$N>ON)$F$O0J2<$N$h$&$K$J$C$F$$$k!%(B

$B#1>O(B$B%3%^%s%I(B
$B#2>O(B$B%7%9%F%`%3!<%k(B
$B#3>O(B$B%i%$%V%i%j4X?t(B
$B#4>O(B$B%G%P%$%9%U%!%$%k(B
$B#5>O(B$B%U%!%$%k7A<0(B
$B#6>O(B$B%2!<%`(B
$B#7>O(B$B$=$NB>(B
$B#8>O(B$B4IM}MQ%3%^%s%I(B

man $B%3%^%s%I$N0z?t$K;XDj$5$l$?L>A0$O!$#1>O$+$i=gHV$K8!:w$5$l$k!%(B $B=>$C$F!$(Bman printf $B$H$9$k$H#1>O$N(B printf $B%3%^%s%I$N%^%K%e%"%k$,I=<($5$l$F$7$^$&!%(B $B%i%$%V%i%j4X?t$G$"$k(B printf(3) $B$K$D$$$FCN$j$?$$$H$-$K$O!$#3>O$G$"$k$3$H$r;XDj$9$k$?$a$KO$r;XDj$9$k!%(B

% man 3 printf [$B

$B3F>O$N@bL@MQ$K(B intro $B$H$$$&%(%s%H%j$,MQ0U$5$l$F$$$k!%(B $B#2>O!J%7%9%F%`%3!<%k!K$K$D$$$FCN$j$?$$$H$-$K$O!$

% man 2 intro [$B

$B%W%m%0%i%`:n@.$+$i

$B%W%m%0%i%`$N:n@.$K$O!$(Bemacs $B$J$I$N%(%G%#%?$G%W%m%0%i%`$r:n@.$7!$$=$l$r(BC$B%3%s%Q%$%i!J(Bcc$B!K$G%3%s%Q%$%k$7!$/$7$:$DF0:n$r3N$+$a$J$,$i:n$k$N$,NI$$!%(B

$B%W%m%0%i%`:n@.$+$i<B9T$^$G(B

$B%$%s%G%s%F!<%7%g%s(B

$B%W%m%0%i%`:n@.;~$K5$$r$D$1$FM_$7$$$3$H$N0l$D$K%$%s%G%s%F!<%7%g%s$,$"$k!%(B

$B%(%G%#%?$H$7$F(BEmacs$B$r;HMQ$7$F$$$k>l9g!$%G%U%)%k%H$N%$%s%G%s%F!<%7%g%s!J;z2<$2!$CJIU$1!K$N%9%?%$%k$O$"$^$j0lHLE*$G$O$J$$$b$N$K$J$C$F$$$k$?$a!$(B.emacs $B$K0J2<$N9T$rDI2C$9$k!%(B $B!JDI2CD>8e$O!$JQ99$rM-8z$K$9$k$?$a$K!$(Bemacs$B$r0lC6=*N;8e!$:F$S5/F0$9$k!%!K(B

(setq c-default-style "linux")

TAB$B%-!<$rC!$/$3$H$G!$@_Dj$5$l$?CM$@$11&$K%$%s%G%s%H!J;z2<$2!K$5$l$k!%(B TAB$B%-!<$rC!$/$N$O9TF,$G$"$kI,MW$O$J$$!%(B

$B%G%U%)%k%H$G$O0J2<$N$h$&$J%9%?%$%k$K$J$k!%(B

     1	void sort(int data[], int count){
     2	  int i, sw=0, last=1, n=count-1;
     3	  while(sw!=n){
     4	    sw = n;
     5	    for(i=n; i>=last; i--)
     6	      if(data[i]<data[i-1]){
     7		swap_array(data, i, i-1);
     8		sw=i;
     9	      }
    10	    last=sw+1;
    11	  }
    12	}

$BJQ998e$O0J2<$N$h$&$J%9%?%$%k$K$J$k!%(B $B$^$?!$JQ?tL>$dM=Ls8l!$1i;;;R$NA08e$K%9%Z!<%9$rF~$l!$C18l$,5M$^$i$J$$$h$&$K$7$?!%(B $B$=$7$F!$JQ?t@k8@It$H

     1	void
     2	sort(int data[], int count)
     3	{
     4		int i;
     5		int sw = 0;
     6		int last = 1;
     7		int n = count - 1;
     8	
     9		while (sw != n) {
    10			sw = n;
    11			for (i = n; i >= last; i--)
    12				if (data[i] < data[i - 1]) {
    13					swap_array(data, i, i - 1);
    14					sw = i;
    15				}
    16			last = sw + 1;
    17		}
    18	}

$B%?%V$,(B8$BJ8;z$H;z2<$2NL$,B?$/$J$j!$%V%m%C%/$,L@3N$K$J$k!%(B $B$^$?!$6uGr$d6u9T$r;H$&$3$H$G!$%W%m%0%i%`Fb$N9=B$$,$o$+$j$d$9$/$J$k!%(B

$B$^$?!$0J2<$N$h$&$JE@$K$bCm0U$7!$FI$_$d$9$$8+$?L\$K$be:No$J%W%m%0%i%`$r=q$/$3$H$r?4$,$1$k!%(B

  • $B=q<0$K0l4S@-$r;}$?$;$k!%!J=q<0$r@0$($k$3$H$K$9$i5$$r8/$o$J$$%W%m%0%i%^$O?.Mj$5$l$J$$!%!K(B
  • 1$B9T$r$"$^$jD9$/$7$9$.$k$3$H$,$J$$$h$&$K$7!$(B90$BJ8;zDxEY$KM^$(!$F1$8J8$G$"$C$F$b2~9T$9$k!%(B
  • $BF~$jAH$s$@9=J8$N7k2L!$%$%s%G%s%H$,?<$/$J$j$9$.$J$$$h$&$K!$=gHV$rF~$l49$($?$j!$4X?t$K$9$k$J$I$N9)IW$r$9$k!%(B

$B"(Cm0U"((B

$B%(%G%#%?$H$7$F(BEmacs$B$r;HMQ$7$F$$$k$+H]$+$K4X$o$i$:!$A0H>!JBh(B1$B!A(B5$B=5!K$N%l%]!<%H2]Bj$G$O!$>e5-$N$h$&$K(B8$BJ8;zJ,$N%?%V$r;z2<$2$K;HMQ$7$?%$%s%G%s%F!<%7%g%s%9%?%$%k$r;HMQ$7!$$^$?>e5-$NCm0UE@$K$b5$$r$D$1$F%W%m%0%i%`$r:n@.$7!$Ds=P$9$k$3$H!%(B $B%$%s%G%s%F!<%7%g%s%9%?%$%k$,0[$J$C$F$$$?$j!$FI$_$K$/$$>l9g$O!$:FDs=P$K$7$^$9!%(B

$B%3%s%Q%$%k$H%j%s%/(B

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

$B0J2<$O!$(Bsum.c $B$H$$$&(B1$B$+$i(B10$B$^$G$NAmOB$r5a$a$k4JC1$J%W%m%0%i%`$r%3%s%Q%$%k

% nl -ba sum.c [$B
     1	#define MAX	10
     2
     3	main()
     4	{
     5		int	i, total;
     6
     7		total = 0;
     8		for (i = 1; i <= MAX; i++)
     9			total += i;
    10
    11		printf("total = %d\n", total);
    12	}
% cc sum.c [$B
sum.c: In function 'main':
sum.c:11: warning: incompatible implicit declaration of built-in function 'printf'
% ./a.out [$B
total = 55
%

cc $B$,(B warning$B!J7Y9p!K$N%a%C%;!<%8$r=P$7$?$,!$@5>o$K=*N;$7$F$$$k!%(B $B7Y9p%a%C%;!<%8$O!$(Bsum.c $B%U%!%$%k$N(B main $B4X?t$N(B11$B9TL\!J(Bsum.c:11:$B$N(B11$B$,(B11$B9TL\$H$$$&0UL#!K$GAH$_9~$_4X?t$N(B printf $B$N0EL[$N@k8@$HHs8_49$K$J$C$F$$$k!$$H$$$&0UL#$G$"$k!%(B warning $B$,=P$F$b%3%s%Q%$%k$O@5>o$K=*N;$9$k$,!$

warning $B$N860x$O!$(Bprintf $B$N@k8@$,$J$$$?$a$G$"$k!%(B $B=>$C$F!$(Bwarning $B$r$O(B man $B$r8+$k$H$o$+$k!%(B

% man 3 printf [$B
PRINTF(3)		 BSD Library Functions Manual		     PRINTF(3)

NAME
     printf, fprintf, sprintf, snprintf, asprintf, vprintf, vfprintf,
     vsprintf, vsnprintf, vasprintf -- formatted output conversion

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdio.h>

     int
     printf(const char * restrict format, ...);

printf$B$N@k8@$O(B stdio.h $B$K4^$^$l$k$N$G!$0J2<$N$h$&$K(B #include <stdio.h> $B$rDI2C$9$k=$@5$r$9$l$P$h$$$3$H$K$J$k!%(B

     1	#include <stdio.h>
     2
     3	#define MAX	10
     4
     5	main()
     6	{
     7		int	i, total;
     8
     9		total = 0;
    10		for (i = 1; i <= MAX; i++)
    11			total += i;
    12
    13		printf("total = %d\n", total);
    14	}

cc$B$K$h$j5/F0$5$l$k%W%m%0%i%`(B

cc $B%3%^%s%I<+BN$O

cc$B$K$h$j5/F0$5$l$k%W%m%0%i%`(B

cc $B$K(B -v $B%*%W%7%g%s$rDI2C$9$k$H!$(Bcc $B$+$i5/F0$5$l$k%W%m%0%i%`$NMM;R$,$o$+$k!%(B -v $B%*%W%7%g%s$O!$(Bcc $B$+$i5/F0$5$l$k%W%m%0%i%`$K;XDj$5$l$k0z?t$bA4$FI=<($5$l$k!%(B $B$=$N$?$a!$Nc$($P%W%j%W%m%;%C%5$N0z?t$G;XDj$5$l$k%^%/%m$d!$%j%s%+$K;XDj$5$l$k%i%$%V%i%j$J$I$rCN$k$3$H$b$G$-$k!%(B

% cc -v sum.c [$B
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646.1~2/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646) (dot 1)
 /usr/libexec/gcc/i686-apple-darwin10/4.2.1/cc1 -quiet -v -imultilib x86_64 -D__DYNAMIC__ sum.c -fPIC -quiet -dumpbase sum.c -mmacosx-version-min=10.6.3 -m64 -mtune=core2 -auxbase sum -version -o /var/tmp//ccGtlQ2k.s
ignoring nonexistent directory "/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../../i686-apple-darwin10/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin10/4.2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
GNU C version 4.2.1 (Apple Inc. build 5646) (dot 1) (i686-apple-darwin10)
	compiled by GNU C version 4.2.1 (Apple Inc. build 5646) (dot 1).
GGC heuristics: --param ggc-min-expand=150 --param ggc-min-heapsize=131072
Compiler executable checksum: 43a7d9aa566166ce7633c3f0a9d9edbb
 /usr/libexec/gcc/i686-apple-darwin10/4.2.1/as -arch x86_64 -force_cpusubtype_ALL -o /var/tmp//ccYjDerD.o /var/tmp//ccGtlQ2k.s
 /usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2 -dynamic -arch x86_64 -macosx_version_min 10.6.3 -weak_reference_mismatches non-weak -o a.out -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. /var/tmp//ccYjDerD.o -lSystem -lgcc -lSystem
%

cc -E

cc $B$K(B -E $B%*%W%7%g%s$rDI2C$9$k$H!$%W%j%W%m%;%C%5!J(Bcpp$B!K$@$1$,5/F0$5$l!$7k2L$OI8=`=PNO!J(Bstdout$B!K$K=P$5$l$k!%(B $B%^%/%m$,$&$^$/E83+$5$l$J$$;~!$(Btypedef$B$,$&$^$/=hM}$5$l$J$$;~$J$I!$%X%C%@%U%!%$%k$K4X78$9$k%(%i!<$,5/$-$?$H$-$K!$%W%j%W%m%;%C%5$rDL$7$?7k2L$r8+$k$H860x$,$o$+$k$3$H$,$"$k!%(B

% cc -E sum.c | nl -ba [$B
     1	# 1 "sum.c"
     2	# 1 "<built-in>"
     3	# 1 "<command line>"
     4	# 1 "sum.c"
     5	# 1 "/usr/include/stdio.h" 1 3 4
     6	# 64 "/usr/include/stdio.h" 3 4
     7	# 1 "/usr/include/_types.h" 1 3 4
     8	# 27 "/usr/include/_types.h" 3 4
     9	# 1 "/usr/include/sys/_types.h" 1 3 4
    10	# 26 "/usr/include/sys/_types.h" 3 4
    11	# 1 "/usr/include/sys/cdefs.h" 1 3 4
    12	# 27 "/usr/include/sys/_types.h" 2 3 4
    13	# 1 "/usr/include/machine/_types.h" 1 3 4
    14	# 26 "/usr/include/machine/_types.h" 3 4
    15	# 1 "/usr/include/ppc/_types.h" 1 3 4
    16	# 31 "/usr/include/ppc/_types.h" 3 4
    17	typedef signed char __int8_t;

... $BCfN,(B ...

   409	# 2 "sum.c" 2
   410
   411
   412
   413	main()
   414	{
   415	 int i, total;
   416
   417	 total = 0;
   418	 for (i = 1; i <= 10; i++)
   419	  total += i;
   420
   421	 printf("total = %d\n", total);
   422	}
%

$B%j%s%/(B

cc $B$K(B -c $B%*%W%7%g%s$rDI2C$9$k$H!$%"%;%s%V%i$^$G$,$O!$85$N(BC$B%W%m%0%i%`$N%U%!%$%kL>$N%5%U%#%C%/%9!J@\Hx<-!K$r(B o $B$KJQ$($?$b$N$K$J$k!%(B $BB($A!$(BC$B%W%m%0%i%`$,(B sum.c $B$H$$$&%U%!%$%kL>$N>l9g$O(B sum.o $B$H$$$&%U%!%$%kL>$K$J$k!%(B

$B%*%V%8%'%/%H%W%m%0%i%`$r(B cc $B$N0z?t$K;XDj$9$k$H!$(Bcc $B$O%5%U%#%C%/%9$+$i0z?t$N%U%!%$%k$,%*%V%8%'%/%H%W%m%W%m%0%i%`$G$"$k$3$H$rH=Dj$7!$%j%s%+$r5/F0$9$k!%(B

% cc -c sum.c [$B
% ls sum.o [$B
sum.o
% cc -v sum.o [$B
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646.1~2/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646) (dot 1)
 /usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2 -dynamic -arch x86_64 -macosx_version_min 10.6.3 -weak_reference_mismatches non-weak -o a.out -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. sum.o -lSystem -lgcc -lSystem
%

$B>e$NNc$G$O!$(Bcollect2 $B$H$$$&%W%m%0%i%`$,5/F0$5$l$F$$$k!%(B $B2<$N$h$&$K!$(Bcollect2 $B$KL@<(E*$K(B -v $B%*%W%7%g%s$rEO$7$F$_$k$H!$(Bld $B$,5/F0$5$l$F$$$k$N$,$o$+$k!%(B

% /usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2 -v -dynamic -arch x86_64 -macosx_version_min 10.6.3 -weak_reference_mismatches non-weak -o a.out -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. sum.o -lSystem -lgcc -lSystem
collect2 version 4.2.1 (Apple Inc. build 5646) (dot 1) (i686 Darwin)
/usr/bin/ld -v -dynamic -arch x86_64 -macosx_version_min 10.6.3 -weak_reference_mismatches non-weak -o a.out -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. sum.o -lSystem -lgcc -lSystem
@(#)PROGRAM:ld  PROJECT:ld64-95.2.12
Library search paths:
	/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64
	/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64
	/usr/lib/i686-apple-darwin10/4.2.1
	/usr/lib/gcc/i686-apple-darwin10/4.2.1
	/usr/lib/gcc/i686-apple-darwin10/4.2.1
	/usr/lib/i686-apple-darwin10/4.2.1
	/usr/lib
	/usr/lib
	/usr/local/lib
Framework search paths:
	/Library/Frameworks/
	/System/Library/Frameworks/
%

$BF0E*%j%s%/$H@EE*%j%s%/(B

$B%j%s%/$NJ}K!$K$O!$F0E*!J%@%$%J%_%C%/!K%j%s%/$H@EE*!J%9%?%F%#%C%/!K%j%s%/$,$"$k!%(B $BF0E*%j%s%/$H$O%i%$%V%i%j$r.$5$/$J$k!%(B $B$^$?!$F0E*%j%s%/$5$l$k%i%$%V%i%j$G;HMQ$5$l$k%a%b%jNN0h$O!$/$J$$!%(B $B$7$+$7!$C!K$r9T$&$N$G!$$o$:$+$K

$BF0E*%j%s%/$5$l$?

% otool -L a.out [$B
a.out:
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.5)
%

make $B%3%^%s%I(B

C$B%W%m%0%i%`$O%U%!%$%kC10L$G$N%7%s%\%k$N%9%3!<%W$r;}$D$?$a!$$^$?Bg$-$J%=!<%9%W%m%0%i%`%U%!%$%k$O%3%s%Q%$%k$K;~4V$,$+$+$k$?$a!$%W%m%0%i%`$OE,EY$KJ#?t%U%!%$%k$KJ,3d$7$F:n@.$9$k$3$H$,K>$^$7$$!%(B C$B%W%m%0%i%`$rJ#?t%U%!%$%k$KJ,3d$7$?>l9g!$$^$:$=$l$>$l$r(B cc -c $B$K$h$j%*%V%8%'%/%H%W%m%0%i%`$K%3%s%Q%$%k$9$k!%(B $B$=$&$9$k$H!$(BC$B%W%m%0%i%`%U%!%$%k$4$H$K!J%5%U%#%C%/%9$,(B o $B$N!K%*%V%8%'%/%H%W%m%0%i%`$N%U%!%$%k$,$G$-$k!%(B $B$3$l$i$N%*%V%8%'%/%H%W%m%0%i%`$N%U%!%$%k$r%j%s%/$7$F

make$B$NNc(B

$B$3$N$h$&$J%3%s%Q%$%k$C$F%3%s%Q%$%k$r9T$&!J%k!<%k$K=>$C$F=hM}$r$9$k$@$1$G!$=hM}$,%3%s%Q%$%k$G$"$kI,MW@-$OA4$/$J$$!K!%(B $B%+%l%s%H%G%#%l%/%H%j$K(B makefile $B$H(B Makefile $B$NN>J}$,$"$C$?>l9g$O!$(Bmakefile $B$,M%@h$5$l$k!%(B $B0J2<$O!$>e$N?^$N%3%s%Q%$%kMakefile $B$H$7$F5-=R$7$?$b$N$G$"$k!%(B

a.out: file-1.o file-2.o
	cc file-1.o file-2.o

file-1.o: file-1.c
	cc -c file-1.c

file-2.o: file-2.c
	cc -c file-2.c

$B%k!<%k$N=q$-J}$N4pK\E*$J$H$3$m$OC1=c$G!$:n@.$7$?$$%?!<%2%C%H$N:n@.J}K!$r0J2<$N$h$&$K5-=R$9$k!%(B $B0MB8%U%!%$%k$,$^$?JL$N0MB8%U%!%$%k$+$i:n@.$5$l$k>l9g!JNc$($P(B file1.o $B$,(B file1.c$B$+$i:n@.$5$l$k>l9g!K$O!$$=$N$?$a$N%k!<%k$r=q$/!%(B $B0MB8%U%!%$%k$,$J$$>l9g$O!$I,$:=hM}$,

$B%?!<%2%C%H(B: $B0MB8$9$k%U%!%$%k(B
<TAB>$B%?!<%2%C%H:n@.$N$?$a$N=hM}(B1
<TAB>$B%?!<%2%C%H:n@.$N$?$a$N=hM}(B2
...
<TAB>$B%?!<%2%C%H:n@.$N$?$a$N=hM}(Bn

$B

% make [$B
cc -c file-1.c
cc -c file-2.c
cc file-1.o file-2.o
%
file-2.c$B$rJQ99(B
% make [$B
cc -c file-2.c
cc file-1.o file-2.o
%

Makefile $B$,J#;($K$J$k$H!$(BMakefile $B$r8+$?$@$1$G$Ol9g!$(Bmake $B$r$9$kA0$K(B make -n $B$H$9$k$H!$

$B%G%P%C%,(B

$B%G%P%C%,$H$7$F(B gdb $B$,MxMQ$G$-$k!%(B $BF|K\8l%^%K%e%"%k$O0J2<$KMQ0U$5$l$F$$$k!%(B

http://www.coins.tsukuba.ac.jp/~syspro/gdb-5.0-doc/

$B%=!<%9%3!<%I$r;2>H$7$J$,$i%G%P%C%,$rMQ$$$?$$>l9g$O(B cc $B$K(B -g $B%*%W%7%g%s$rIU$1$F%3%s%Q%$%k$9$kI,MW$,$"$k!%(B -g $B%*%W%7%g%s$rIU$1$F$$$J$$>l9g$G$b!$%G%P%C%,$rMQ$$$k$3$H$O$G$-!$%P%C%/%H%l!<%9!J4X?t$N8F$S=P$7MzNr!K$d%"%;%s%V%j8@8l$G$I$NL?Na$GLdBj$,H/@8$7$?$+$O$o$+$k!%(B $B!J(Bstrip$B%3%^%s%I$G%7%s%\%k>pJs$,:o=|$5$l$F$7$^$&$H!$4X?tL>$J$I%0%m!<%P%k%7%s%\%k$bI=<($5$l$J$/$J$k!%!K(B -g $B%*%W%7%g%s$rIU$1$F%3%s%Q%$%k$7$?>l9g$O!$%=!<%9%3!<%I$N2?9TL\$KLdBj$,H/@8$7$?$N$+$,$o$+$j!$$^$?JQ?tL>$r;XDj$7$F$=$NCM$rD4$Y$k$3$H$b$G$-$k!%(B

$BNI$/$"$k%P%0$K%;%0%a%s%F!<%7%g%s%U%)%k%H!J(Bsegmentation fault$B!K$d%P%9%(%i!o$KE57?E*$JNc$H$7$F(BNULL$B%]%$%s%?%"%/%;%9$,$"$k!%(B 0$BHVCO$ODL>o%"%/%;%9$,5v2D$5$l$F$$$J$$$?$a!$(BNULL$B%]%$%s%?$K%"%/%;%9$9$k$H%;%0%a%s%F!<%7%g%s%U%)%k%H$d%P%9%(%i!<$,H/@8$9$k!%(B Mac OS X$B$G$O(BNULL$B%]%$%s%?%"%/%;%9$O%P%9%(%i!<$r5/$3$9!%(B $B0J2<$O(BNULL$B%]%$%s%?%"%/%;%9$K$h$j%;%0%a%s%F!<%7%g%s%U%)%k%H$r5/$3$9%W%m%0%i%`$r!$%G%P%C%,$+$i

% cc segfault.c [$B
% a.out [$B
Bus error
% cc -g segfault.c [$B
% gdb a.out [$B
GNU gdb 6.1-20040303 (Apple version gdb-434) (Wed Nov  2 17:28:16 GMT 2005)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "powerpc-apple-darwin"...Reading symbols for shared libraries .. done

(gdb) run [$B
Starting program: /home1/prof/shui/syspro/progs-2006/a.out
Reading symbols for shared libraries . done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00002ac0 in access_pointer (a=0x0) at segfault.c:5
5		printf("%c", *a);
(gdb) backtrace [$B
#0  0x00002ac0 in access_pointer (a=0x0) at segfault.c:5
#1  0x00002b08 in test () at segfault.c:10
#2  0x00002b34 in main () at segfault.c:15
(gdb) list [$B
1	#include <stdio.h>
2
3	access_pointer(char *a)
4	{
5		printf("%c", *a);
6	}
7
8	test()
9	{
10		access_pointer(NULL);
(gdb) print a [$B
$1 = 0x0
(gdb) quit [$B
The program is running.	 Exit anyway? (y or n) y [$B
%

$B%W%m%0%i%_%s%0$H%G%P%C%0(B

$B%W%m%0%i%_%s%0(B

$B$"$kDxEY$NBg$-$5$N%W%m%0%i%`$r$$$-$J$j:n@.$9$k$N$OFq$7$$!%(B $BLdBj$d@_Dj!$>r7o$rC1=c2=$7!$$=$l$r2r$/>.$5$$4JC1$J%W%m%0%i%`$r:n@.$7!$$A$c$s$HF0$/$h$&$K$9$k$H$3$m$+$i;O$a$k!%(B

$BNc$($P!$%P%V%k@0NsK!$N%W%m%0%i%`$r=q$/$3$H$r9M$($F$_$k!%(B $B:G=i$+$i!$G$0U8D$N%G!<%?$,F~$C$?%U%!%$%k$NFbMF$r@0Ns$7$F=PNO$9$k%W%m%0%i%`$r=q$3$&$H$9$k$N$O!J$=$l$J$j$N7P83$,$J$1$l$P!K8-L@$H$O8@$($J$$!%(B $BNc$($P!$F~NOIt!$@0Ns$NItJ,!$=PNOIt$KJ,3d$7!$$=$l$>$l$NItJ,$,@5$7$/F0:n$9$k$h$&%W%m%0%i%_%s%0$*$h$S%G%P%C%0$r$7$F$+$i!$7k9g$9$k$h$&$K$9$Y$-$G$"$k!%(B

$B@0Ns$NItJ,$r:n@.$9$k;~$K$O!$@0Ns$9$k%G!<%?$,I,MW$G$"$k!%(B $BF~NOIt$,40@.$9$kA0$J$i$P!$Bg0hJQ?t$K=i4|CM$H$7$F%G!<%?$rM?$($k$3$H$,=PMh$k!%(B $B$^$?!$7k2L$r3NG'$9$k$?$a$N2>$N=PNOIt$bI,MW$G$"$k!%(B $B$3$N$h$&$K!$2>$NF~=PNOIt$rMQ$$$F:n@.$7$?%P%V%k@0NsK!$N%W%m%0%i%`$O0J2<$N$h$&$K$J$k!J@0Ns$NItJ,$O>JN,!K!%(B

     1  #include <stdio.h>
     2  
     3  #define SAMPLE_COUNT 6
     4  int sample[SAMPLE_COUNT] = {8, 12, 3, 15, 7, 4};
     5  
     6  void
     7  print_data(int a[], int count)
     8  {
     9          int i;
    10  
    11          for (i = 0; i < count; i++)
    12                  printf("%2d ", a[i]);
    13          printf("\n");
    14  }
    15  
    16  void
    17  swap_array(int a[], int i, int j)
    18  {
    19          int tmp;
    20  
    21          tmp = a[i];
    22          a[i] = a[j];
    23          a[j] = tmp;
    24  }
    25  
    26  void
    27  sort(int data[], int count)
    28  {
                .... omitted ....
    35  }
    36  
    37  main()
    38  {
    39          sort(sample, SAMPLE_COUNT);
    40          print_data(sample, SAMPLE_COUNT);
    41	}

$B%G%P%C%0(B

$B%W%m%0%i%_%s%0$K$O%G%P%C%0!J%P%0

$BB?$/$N%*%Z%l!<%F%#%s%0%7%9%F%`$G$O%G%P%C%,$,MQ0U$5$l$F$$$k$,!$:G$b4pK\E*$J%G%P%C%0J}K!$O(Bprintf$B$rMQ$$$kJ}K!$G$"$k!%(B printf$B$rMQ$$$k$3$H$G(B

  • $B@)8f$NN.$l$N3NG'(B
  • $BJQ?t$NCM$N3NG'(B
$B$r$9$k$3$H$,$G$-$k!%(B printf$B%G%P%C%0$O!$%W%m%0%i%`$,$I$N$h$&$J%Q%9$G

$B>e5-$N%P%V%k@0NsK!$N%W%m%0%i%`$K0J2<$N(Bsort$B4X?t$rF~$l!$(B

    26  void
    27  sort(int data[], int count)
    28  {
    29          int i, j;
    30  
    31          for (i = 0; i < count; i++)
    32                  for (j = i; j < count; j++)
    33                          if (data[j] > data[j + 1])
    34                                  swap_array(data, j, j + 1);
    35	}

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

% ./a.out [$B
 8  3  4 -1881141248  7 12 
%

$B$=$3$G!$%G%P%C%0MQ$KESCf7P2a$r=PNO$9$k$?$a$K!$(B32,33$B9TL\$rDI2C$9$k!%(B

    26  void
    27  sort(int data[], int count)
    28  {
    29          int i, j;
    30  
    31          for (i = 0; i < count; i++) {
    32                  printf("%d: ", i);
    33                  print_data(data, count);
    34  
    35                  for (j = i; j < count; j++)
    36                          if (data[j] > data[j + 1])
    37                                  swap_array(data, j, j + 1);
    38          }
    39	}

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

% ./a.out [$B
0:  8 12  3 15  7  4 
1:  8  3 12  7  4 -1881141248 
2:  8  3  7  4 -1881141248 12 
3:  8  3  4 -1881141248  7 12 
4:  8  3  4 -1881141248  7 12 
5:  8  3  4 -1881141248  7 12 
 8  3  4 -1881141248  7 12 
%

$B>pJs$,B-$j$J$$$N$G!$FbB&$N(B for $BJ8$NCf$G2?$,5/$3$C$F$$$k$N$+D4$Y$k$3$H$K$7!$(B36~38$B9TL\!$(B40,41$B9TL\!$(B44,45$B9TL\$rDI2C$9$k!%(B

    26  void
    27  sort(int data[], int count)
    28  {
    29          int i, j;
    30  
    31          for (i = 0; i < count; i++) {
    32                  printf("%d: ", i);
    33                  print_data(data, count);
    34  
    35                  for (j = i; j < count; j++) {
    36                          printf("\t[%d]=%d > [%d]=%d",
    37                              j, data[j], j + 1, data[j + 1]);
    38  
    39                          if (data[j] > data[j + 1]) {
    40                                  printf(" ... swap!!");
    41  
    42                                  swap_array(data, j, j + 1);
    43                          }
    44  
    45                          printf("\n");
    46                  }
    47		}
    48	}

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

% ./a.out [$B
0:  8 12  3 15  7  4 
        [0]=8 > [1]=12
        [1]=12 > [2]=3 ... swap!!
        [2]=12 > [3]=15
        [3]=15 > [4]=7 ... swap!!
        [4]=15 > [5]=4 ... swap!!
        [5]=15 > [6]=-1881141248 ... swap!!
1:  8  3 12  7  4 -1881141248 
        [1]=3 > [2]=12
        [2]=12 > [3]=7 ... swap!!
        [3]=12 > [4]=4 ... swap!!
        [4]=12 > [5]=-1881141248 ... swap!!
        [5]=12 > [6]=15
2:  8  3  7  4 -1881141248 12 
        [2]=7 > [3]=4 ... swap!!
        [3]=7 > [4]=-1881141248 ... swap!!
        [4]=7 > [5]=12
        [5]=12 > [6]=15
3:  8  3  4 -1881141248  7 12 
        [3]=-1881141248 > [4]=7
        [4]=7 > [5]=12
        [5]=12 > [6]=15
4:  8  3  4 -1881141248  7 12 
        [4]=7 > [5]=12
        [5]=12 > [6]=15
5:  8  3  4 -1881141248  7 12 
	[5]=12 > [6]=15
 8  3  4 -1881141248  7 12 
%

data[j + 1] $B$^$G%"%/%;%9$5$l$k$N$G!$(Bfor $BJ8$NHf3SH=Dj<0$G$O(B count - 1 $B$7$?CM$r;H$&$h$&$KJQ99$9$k!%(B

    26  void
    27  sort(int data[], int count)
    28  {
    29          int i, j;
    30          int n = count - 1;
    31  
    32          for (i = 0; i < n; i++) {
    33                  printf("%d: ", i);
    34                  print_data(data, count);
    35  
    36                  for (j = i; j < n; j++) {
    37                          printf("\t[%d]=%d > [%d]=%d",
    38                              j, data[j], j + 1, data[j + 1]);
    39  
    40                          if (data[j] > data[j + 1]) {
    41                                  printf(" ... swap!!");
    42  
    43                                  swap_array(data, j, j + 1);
    44                          }
    45  
    46                          printf("\n");
    47                  }
    48		}
    49	}

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

% ./a.out [$B
0:  8 12  3 15  7  4 
        [0]=8 > [1]=12
        [1]=12 > [2]=3 ... swap!!
        [2]=12 > [3]=15
        [3]=15 > [4]=7 ... swap!!
        [4]=15 > [5]=4 ... swap!!
1:  8  3 12  7  4 15 
        [1]=3 > [2]=12
        [2]=12 > [3]=7 ... swap!!
        [3]=12 > [4]=4 ... swap!!
        [4]=12 > [5]=15
2:  8  3  7  4 12 15 
        [2]=7 > [3]=4 ... swap!!
        [3]=7 > [4]=12
        [4]=12 > [5]=15
3:  8  3  4  7 12 15 
        [3]=7 > [4]=12
        [4]=12 > [5]=15
4:  8  3  4  7 12 15 
	[4]=12 > [5]=15
 8  3  4  7 12 15 
%

$B$3$N$^$^$G$OESCf7P2a$,8+$K$/$$$N$G!$>e$GDI2C$7$?FbB&$N(B for $BJ8$NCf$G$N%G%P%C%0=PNO$r%3%a%s%H%"%&%H$7!$%3%s%Q%$%k

% ./a.out [$B
0:  8 12  3 15  7  4 
1:  8  3 12  7  4 15 
2:  8  3  7  4 12 15 
3:  8  3  4  7 12 15 
4:  8  3  4  7 12 15 
 8  3  4  7 12 15 
%

$B0lHVBg$-$$(B15$B$O:G=i$N30B&$N%k!<%W$G:G8eHx$^$G0\F0$5$l$F$$$k$,!$@hF,$N(B8$B$O$=$N$^$^$G$"$k$3$H$+$i!$FbB&$N%k!<%W$KLdBj$,$"$k$H9M$($i$l$k!%(B $BFbB&$N%k!<%W$O!$:G=i$O(B data[0] ~ data[5] $B$r!$

    26  void
    27  sort(int data[], int count)
    28  {
    29          int i, j;
    30          int n = count - 1;
    31  
    32          for (i = 0; i < n; i++) {
    33                  printf("%d: ", i);
    34                  print_data(data, count);
    35  
    36                  for (j = 0; j < n - i; j++) {
    37  //                      printf("\t[%d]=%d > [%d]=%d",
    38  //                          j, data[j], j + 1, data[j + 1]);
    39  
    40                          if (data[j] > data[j + 1]) {
    41  //                              printf(" ... swap!!");
    42  
    43                                  swap_array(data, j, j + 1);
    44                          }
    45  
    46  //                      printf("\n");
    47                  }
    48  	}
    49	}

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

% ./a.out [$B
0:  8 12  3 15  7  4 
1:  8  3 12  7  4 15 
2:  3  8  7  4 12 15 
3:  3  7  4  8 12 15 
4:  3  4  7  8 12 15 
 3  4  7  8 12 15 
%

$B0J>e$N$h$&$K!$(Bprintf$B%G%P%C%0$G$O!$:G=i$OBg$-$J%V%m%C%/$N7P2a$r8+$k$h$&$K(Bprintf$B$rF~$l!$$I$NItJ,$KLdBj$,$"$j$=$&$+$rM=B,$9$k!%(B $B

$B%G%P%C%0$N4pK\$O!$$B!V$3$3$OBg>fIW!W(B$B$H;W$o$J$$$3$H!%(B $B!V;W$$9~$_!W(B$B$O%G%P%C%0$NE7E($G$"$k!%(B

$B%]%$%s%?!J#1!K(B

$B%7%9%F%`%W%m%0%i%`$GMQ$$$k%i%$%V%i%j4X?t$d%7%9%F%`%3!<%k$K$O%]%$%s%?$,I,?\$G$"$k!%(B $B4X?t$r8F$S=P$7!$$^$H$^$C$?%G!<%?$r$d$j

$BNc$($P2

$B%G!<%?%3%T!<@h$N%]%$%s%?(B

$BB>$KJ8;zNsA`:n$K$b%]%$%s%?$OIT2D7g$G$"$k$?$a!$%]%$%s%?$r$h$/M}2r$7$F$*$/I,MW$,$"$k!%(B

& $B$H(B * $B$N4X78(B

$B%"%I%l%91i;;;R(B & $B$r$9$G$K@k8@$5$l$F$$$kJQ?t$NA0$KIU$1$k$3$H$G!$$=$NJQ?t$NCM$r3JG<$9$k$?$a$K3d$jEv$F$i$l$?NN0h$N%"%I%l%9$,F@$i$l$k!%(B $B$3$N%"%I%l%9$N$3$H$r%]%$%s%?CM$H$$$&!%(B

$B4V@\;2>H1i;;;R(B * $B$O!$%]%$%s%?CM$,;X$9NN0h$NCM$rA0!JJQ?tL>!K$G$O$J$/!$%]%$%s%?CM$rMQ$$$F;2>H$9$k$N$G4V@\;2>H$H$$$&!%(B

$B2$lJL$NJQ?t$G$"$j!$$=$l$>$lJL$NNN0h$,3d$jEv$F$i$l$k!%(B

$B%]%$%s%?(B

i $B$O(B1000$BHVCO$KCV$+$l$F$$$k$b$N$H$9$k$H!$(B&i $B$NCM$O(B 1000 $B$H$J$j!$(Bp $B$K(B &i $B$rBeF~$9$k$H(B 1000 $B$,F~$k!%(B i $B$K$O(B 5 $B$,BeF~$5$l$?$H$9$k$H!$(B*p $B$NCM$O(B 5 $B$K$J$k!%(B $B?^Cf$K$O$J$$$,!$(Bp $B$K(B &i $B$,BeF~$5$l$?>uBV$N$^$^!$(B*p $B$K(B 50 $B$rBeF~$9$k$H(B i $B$NCM$O(B 50 $B$K$J$k!%(B

$B%]%$%s%?$r;H$&$H$G$-$k$3$H(B

$B%]%$%s%?CM$O$"$kJQ?t!JNN0h!K$r;2>H$9$kCM$G$"$k!%(B $BCM$G$"$k$N$G!$JL$N4X?t$K%]%$%s%?CM$rEO$9$3$H$,$G$-$k!%(B $BEO$5$l$?J}$N4X?t$O!$%]%$%s%?CM$K$h$j;2>H$5$l$kJQ?t$NCM$rJQ99$9$k$3$H$,$G$-$k!%(B

$B2$C$F!$(Bfunc2 $B8F$S=P$78e$K(B i $B$NCM$r=PNO$7$?7k2L$O(B 0 $B$N$^$^$G$"$k!%(B

$B4X?t8F$S=P$7(B

$B0lJ}!$2H1i;;;R$rIU$1$?(B *i $B$K(B 5 $B$rBeF~$7$F$$$k!%(B $B$3$N>l9g!$(Bfunc2 $B$K$*$1$k(B *i $B$O(B func $B$N(B i $B$r;2>H$7$F$$$k$?$a!$(Bfunc2 $B$GBeF~$7$?CM$O(B func $B$N(B i $B$K$OH?1G$5$l$k!%(B $B=>$C$F!$(Bfunc2 $B8F$S=P$78e$K(B i $B$NCM$r=PNO$7$?7k2L$O(B 5 $B$K$J$k!%(B

$B4X?t8F$S=P$7(B

$B%]%$%s%?$r;H$&;~$K5$$r$D$1$k$3$H(B

$B4X?t4V$G$N%]%$%s%?CM$N

$B4X?t4V$G%]%$%s%?CM$rH$9$kJQ?t$,$I$3$G@k8@!JNN0h3NJ]!K$5$l$F$$$k$N$+!$Cm0U$9$kI,MW$,$"$k!%(B $BBg0hJQ?t$d%R!<%WNN0h!J(Bmalloc$B$7$F3NJ]$7$?NN0h!K$O!$%W%m%0%i%`Cf$I$3$G$bM-8z$G$"$k$N$GLdBj$O$J$$!%(B $B$7$+$7!$%m!<%+%kJQ?t$K$D$$$F$OCm0U$,I,MW$G$"$k!%(B $B%m!<%+%kJQ?t$O!$$=$l$r@k8@$7$?4X?t$+$i(B return $B$9$kA0$^$G$N4V$@$1M-8z$G$"$k!%(B $B$=$N$?$a!$%m!<%+%kJQ?t$X$N%]%$%s%?CM$rLa$jCM$K$7$F$O$$$1$J$$!%(B

$B0J2<$N%W%m%0%i%`$G$O!$(Bmain$B4X?t$O4X?t(B badfunc $B$r8F$S=P$7%]%$%s%?CM$rLa$jCM$H$7$FH@h$,(B badfunc $B$N%m!<%+%kJQ?t$J$N$,Bg$-$JLdBj$G$"$k!%(B

     1  #include <stdio.h>
     2  
     3  int *
     4  badfunc()
     5  {
     6          int i = 5;
     7  
     8          return &i;
     9  }
    10  
    11  main()
    12  {
    13          int *i = badfunc();
    14  
    15          printf("1: %d\n", *i);
    16          printf("2: %d\n", *i);
    17	}

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

% cc pointer-4.c [$B
pointer-4.c: In function $B!F(Bbadfunc$B!G(B:
pointer-4.c:8: warning: function returns address of local variable
% a.out [$B
1: 5
2: -1073743436
%

$B>e5-$N%W%m%0%i%`$O!$Nc$($P(B malloc $B$r;HMQ$7$F%R!<%WNN0h$K3NJ]$9$k$3$H$G!$GK2u$5$l$k$3$H$O$J$/$J$k!%(B $B!J(Bmalloc$B$K$D$$$F$O(B$B%]%$%s%?!J#2!K(B$B$G>\=R!%!K(B $B$7$+$7!$%R!<%WNN0h$K3NJ]$9$k(B malloc$B!J$*$h$S$=$NGI@84X?t$G$"$k(Bcalloc, valloc$B!K$r;HMQ$9$k>l9g$O!$3NJ]$7$?NN0h$,ITMW$K$J$C$?;~$KI,$:(B free $B$9$kI,MW$,$"$k!%(B free $B$;$:$K3NJ]$7$?NN0h$N%]%$%s%?CM$r<:$C$F$7$^$&$H!$%a%b%j%j!<%/$H$$$&LdBj$,H/@8$9$k!%(B

     4	int *
     5	goodfunc()
     6	{
     7		int *i = malloc(sizeof(int));
     8	
     9		*i = 5;
    10	
    11		return i;
    12	}

$B$=$NB>$h$/$"$k4V0c$$(B

$B%]%$%s%?7?JQ?t$rJ#?t@k8@$9$k$H$-$K$O!$$=$l$>$l$NJQ?tL>$NA0$K(B * $B$rIU$1$k!%(B

     1  func()
     2  {
     3          int *p, *q;

$B$^$?!$%]%$%s%?JQ?t$KCM!J%]%$%s%?CM!K$rF~$l$:$K;2>H$7$F$O$$$1$J$$!%(B

     1  func()
     2  {
     3          int *p;
     4
     5          *p = 5;

$B4V0c$C$?%"%I%l%9$K=q$$$F$7$^$&Kt$O=q$3$&$H$9$k$H$$$m$$$mLdBj$,H/@8$9$k!%(B $B=q$-9~$a$J$$%"%I%l%9$K=q$3$&$H$9$k$H!$%;%0%a%s%F!<%7%g%s%U%)%k%H$,H/@8$7!$%W%m%0%i%`$O0[>o=*N;$9$k!%(B $B$3$N>l9g$O!$0[>o=*N;$K$h$j4V0c$C$?$3$H$,5/$-$F$$$k$3$H$,$9$0$K$o$+$k$N$G!$$^$@$^$7$J>l9g$G$"$k!%(B

$B=q$-9~$a$k%G!<%?NN0h$@$,!$0U?^$H$O0c$&4V0c$C$?%"%I%l%9$K=q$-9~$^$l$F$7$^$&$H!$=q$-9~$_<+BN$O@.8y$7$F$7$^$$!$%W%m%0%i%`$N

$B$3$l$r$&$^$/;H$C$?$N$,%P%C%U%!%*!<%P%U%m!<$G$"$k!%(B $B30It$+$i%9%?%C%/>e$K3NJ]$5$l$F$$$k%P%C%U%!$h$j$bB?$/$N%G!<%?!J%W%m%0%i%`!K$rFI$_9~$^$;$k$3$H$K$h$j!$%W%m%0%i%`$Nh$C/$7>\$7$/@bL@$9$k!%(B

$B%]%$%s%?$OHs>o$KJXMx$G$"$j%7%9%F%`%W%m%0%i%_%s%0$K$O7g$+$;$J$$$,!$:Y?4$NCm0U$r$b$C$F;HMQ$7$J$$$H$$$1$J$$!%(B

$BJ8;z!$J8;zNs$N%G!<%?I=8=(B

$BJ8;z%3!<%I(B

$B%3%s%T%e!<%?$O(B2$B?J?t$7$+07$($J$$$N$G!$J8;z$b?t$H$7$FI=$9I,MW$,$"$k!%(B $B$"$k?tCM$,$I$NJ8;z$K$"$?$k$+$NBP1~$N7h$^$j$rJ8;z%3!<%I$H8F$V!%(B $BJ8;z%3!<%I$K$OM#0l@dBP$H$$$&$h$&$J$b$N$O$J$/!$>l9g$K$h$C$F;H$$J,$1$i$l$F$$$k!%(B $B2$JF$G$OI,MW$H$J$kJ8;z?t$,>/$J$$$?$a!$J8;z%3!<%I$bI8=`E*$J$b$N$,$"$k$,!$$=$l0J30!JFC$KF|K\!K$OBgJQJ#;($K$J$C$F$7$^$C$F$$$k!%(B

  • ASCII$B!J%"%a%j%+$G:n$i$l$?%"%k%U%!%Y%C%H!$?t;z!$5-9f$rI=$9J8;z%3!<%I!K(B
  • Latin-1$B!J(BISO 8859-1$B5,3J$K$h$j5,Dj$5$l$F$$$k@>2$=t9qMQJ8;z%3!<%I!K(B
  • ISO-2022-JP$B!J(BJIS$B5,3J$K$h$C$F5,Dj$5$l$F$$$kF|K\8lJ8;z%3!<%I!K(B
  • $B%7%U%H(BJIS$B%3!<%I!J(BMicrosoft$B$K$h$C$F:n$i$l$?F|K\8lJ8;z%3!<%I!$(BSJIS$B%3!<%I$H$b8F$P$l$k!K(B
  • EUC-JP$B!J(BAT&T$B$K$h$C$F:n$i$l$?3F9q8lMQ%3!<%I$N$&$AF|K\8l$NJ8;z%3!<%I!K(B
  • UTF-8$B!J9q:]E*$KE}0lE*$K;H$($k$h$&$K$H:vDj$5$l$?J8;z%3!<%I%U%)!<%^%C%H!K(B

ASCII$B%3!<%I(B

UNIX$B$GI8=`E*$K;H$o$l$F$-$?$N$,(BASCII$B!J%"%9%-!$N$H$*$j%"%a%j%+$G;H$&$?$a$K:n$i$l$?$b$N$G$"$k!%(B 7$B%S%C%H$GI=8=$5$l!$%m!<%^;z!$?t;z!$5-9f!$@)8f%3!<%I$+$i$J$k!%(B $B?tCM$H$NBP1~$O0J2<$NDL$j!'(B

$B>e0L(B3$B%S%C%H"*(B
$B"-2<0L(B4$B%S%C%H(B
01 23 45 67
0NULDLE SP0@P`p
1SOHDC1 !1AQaq
2STXDC2 "2BRbr
3ETXDC3 #3CScs
4EOTDC4 $4DTdt
5ENQNAC %5EUeu
6ACKSYN &6FVfv
7BELETB '7GWgw
8BSCAN (8HXhx
9HTEM) 9IYiy
ALF/NLSUB *:JZj z
BVTESC +;K[k{
CFFFS, <L$B!@(Bl|
DCRGS -=M]m}
ESORS .>N^n~
FSIUS /?O_oDEL

$B@)8fId9f$N0UL#(B

EUC-JP

EUC $B$O(B Extended UNIX Code $B$NN,$G$"$k$h$&$K!$(BEUC-JP$B$O(BUNIX$B$G$O9-$/;H$o$l$F$$$kF|K\8lJ8;z%3!<%I$G$"$k!%(B $B4pK\E*$K$O4A;z(B1$BJ8;z$r(B2$B%P%$%H$GI=$9$,!$(B3$B%P%$%H$GI=$5$l$kJd=u4A;z$b$"$k!%(B

1$B%P%$%HL\!'(BB0
$B2<0L(B4$B%S%C%H"*(B
$B"->e0L(B4$B%S%C%H(B
0123456789ABCDEF
A0$B0!(B$B0"(B$B0#(B$B0$(B$B0%(B$B0&(B$B0'(B$B0((B$B0)(B$B0*(B$B0+(B$B0,(B$B0-(B$B0.(B$B0/(B
B0$B00(B$B01(B$B02(B$B03(B$B04(B$B05(B$B06(B$B07(B$B08(B$B09(B$B0:(B$B0;(B$B0<(B$B0=(B$B0>(B$B0?(B
C0$B0@(B$B0A(B$B0B(B$B0C(B$B0D(B$B0E(B$B0F(B$B0G(B$B0H(B$B0I(B$B0J(B$B0K(B$B0L(B$B0M(B$B0N(B$B0O(B
D0$B0P(B$B0Q(B$B0R(B$B0S(B$B0T(B$B0U(B$B0V(B$B0W(B$B0X(B$B0Y(B$B0Z(B$B0[(B$B0\(B$B0](B$B0^(B$B0_(B
E0$B0`(B$B0a(B$B0b(B$B0c(B$B0d(B$B0e(B$B0f(B$B0g(B$B0h(B$B0i(B$B0j(B$B0k(B$B0l(B$B0m(B$B0n(B$B0o(B
F0$B0p(B$B0q(B$B0r(B$B0s(B$B0t(B$B0u(B$B0v(B$B0w(B$B0x(B$B0y(B$B0z(B$B0{(B$B0|(B$B0}(B$B0~(B

$B>e5-$NI=$N:G=i$K$"$k!V0!!W$H$$$&4A;z$O(B1$B%P%$%HL\$,(B B0$B!$(B2$B%P%$%HL\$,(B A1$B$H$J$k!%(B EUC-JP$B$G$O!$4A;z$O(B1$B%P%$%HL\!$(B2$B%P%$%HL\6&$K(B8$B%S%C%HL\$,N)$C$F$$$k!J(B1$B$G$"$k!K!%(B $B$=$N$?$a!$$"$kG$0U$N(B1$B%P%$%H$r8+$?$@$1$G4A;z$G$"$k$+$I$&$+H=JL$G$-$k$H$$$&MxE@$,$"$k!%(B $B$7$+$7!$$=$l$,4A;z$N(B1$B%P%$%HL\$J$N$+(B2$B%P%$%HL\$J$N$+$O$o$+$i$J$$!%(B

$B%P%C%/%9%i%C%7%e!V!@!W$H1_%^!<%/!V(B\$B!W(B

$B0J2<$N%P%C%/%9%i%C%7%e!V!@!W$K$D$$$F$N5-=R$O!$(BMac OS X $B$K$O$"$F$O$^$j$^$;$s!%(B Mac OS X $B$r;H$C$F$$$k>l9g$O!$H>3Q%P%C%/%9%i%C%7%e!V(B\$B!W$O@5$7$/I=<($5$l$^$9!%(B

$BF|K\8l$NJ8;z%3!<%I$G$O!$(BASCII$B%3!<%I$KAjEv$9$k%"%k%U%!%Y%C%H5Z$S5-9fItJ,$N%P%C%/%9%i%C%7%e!V!@!W!J$3$N%P%C%/%9%i%C%7%e$OA43Q$NJ8;z!K$,1_%^!<%/!V(B\$B!W$K$"$F$i$l$F$7$^$C$F$$$k!%(B $B$=$N$?$a!$J8;z%3!<%I!J?tCM!K$H$7$F$OF1$8CM$G$"$k$,!$L\$K8+$($kJ8;z$H$7$F$O0c$&$H$$$&$d$d$3$7$$$3$H$K$J$C$F$$$k!%(B $BNc$($P0J2<$N4JC1$J%W%m%0%i%`$N$h$&$K!$(BC$B%W%m%0%i%`Cf$K1_%^!<%/!V(B\$B!W$,=P$F$-$?$i!$%P%C%/%9%i%C%7%e$HF1$8$H$_$J$7$^$7$g$&!%(B

#include <stdio.h>

main()
{
	printf("hello world!\n");
}

$B$5$i$K>\$7$$2r@b(B

$B?7>k@h@8$,=q$+$l$?2r@b$r;2>H$7$F$/$@$5$$!%(B
http://www.hlla.is.tsukuba.ac.jp/~yas/classes/ipe/nitiniti2-enshu-1996/1996-11-18/kanji-code.html

C$B8@8l$K$*$1$kJ8;z$HJ8;zNs(B

$BF|K\8lJ8;z%3!<%I$N

$BJ8;z$O%7%s%0%k%/%)!<%F!<%7%g%s!V(B'$B!W$G0O$^$l$F$*$j!$J8;zNs$O%@%V%k%/%)!<%F!<%7%g%s!V(B"$B!W$G0O$^$l$F$$$k!%(B 'A' $B$OJ8;z$G$"$j!$(B"A" $B$OJ8;zNs$G$"$k!%(B $B8+$?L\$N:9$O$o$:$+$+$b$7$l$J$$$,!$N>

$BJ8;z(B

$B%7%s%0%k%/%)!<%F!<%7%g%s!V(B'$B!W$G0O$^$l$?J8;z$O(B char $B7?$NDj?t$G$"$j!$CM$O(BASCII $B%3!<%I$K$*$1$kJ8;z$KBP1~$7$?CM$K$J$k!%(B $B2<$N(B (1) $B$H(B (2) $B$OF1$8CM$rJQ?t(B c $B$KBeF~$7$F$*$j!$%W%m%0%i%`$NFI$_$d$9$50J30!$0UL#E*$K$b2?$iJQ$o$j$O$J$$!%(B

char c;
c = 'A';	/* (1) */
c = 0x41;	/* (2) */

$BJ8;z$O?tCM$G$"$k$?$a!$1i;;$dHf3S$NBP>]$K$J$k!%(B $B2<$N%W%m%0%i%`$G$O!$(Bchar $B7?$NJQ?t(B c $B$r(B ++ $B$G%$%s%/%j%a%s%H!J(B7$B9TL\!K$7$?$j!$(B<= $B$GJ8;zDj?t$HHf3S!J(B6$B9TL\!K$7$F$$$k!%(B

     1	#include <stdio.h>
     2
     3	main()
     4	{
     5		char c = 'a';
     6		while (c <= 'z')
     7			putchar(c++);
     8		putchar('\n');
     9	}

$BJ8;zNs(B

$BJ8;z$O(B1$B$D$N?tCM$G$"$k$?$a!$J8;z$NJB$S$G$"$kJ8;zNs$OG[Ns$H$7$FI=$5$l$k!%(B $BJ8;zNs$N=*C<$rI=$9$?$a$K!$J8;zNs$N:G8e$K$O(B 0 $B$,CV$+$l$k!%(B $BJ8;zNs$K$O=*C<$N(B 0 $B$,4^$^$l$k$?$a!$J8;zNs$ND9$5$OI=<($5$l$kJ8;z?t$h$j$b(B 1 $BBg$-$/$J$k!%(B $B2<$N?^$O(B "A" $B$*$h$S(B "Hello" $B$H$$$&J8;zNs$,$I$N$h$&$K3JG<$5$l$k$+?^<($7$?$b$N$G$"$k!%(B

$BJ8;zNs$N3JG<(B

$BG[Ns$N(B0$BHVL\$NMWAG$+$i=gHV$KJ8;z$,F~$l$i$l!$:G8e$KJ8;zNs$N=*C<$rI=$9(B 0 $B$,F~$C$F$$$k!%(B $B=*C<$,(B \0 $B$H=q$$$F$"$k$N$O!$CM$,(B 0 $B$NJ8;z$O(B '\0' $B$HI=5-$9$k$+$i$G$"$k!%(B

$B0J2<$N%W%m%0%i%`$O!$J8;z$rG[Ns$K3JG<$7$?$b$N$,J8;zNs$K$J$k$3$H$r3N$+$a$k$b$N$G$"$k!%(B

     1	#include <stdio.h>
     2
     3	char s[] = {'H', 'e', 'l', 'l', 'o', 0};
     4
     5	main()
     6	{
     7		int	i = 0;
     8
     9		printf("%s\n", s);
    10
    11		while (s[i]) {
    12			printf("[%d] = %c\n", i, s[i]);
    13			i++;
    14		}
    15	}

3$B9TL\$G$O!$J8;z7?G[Ns(B s $B$K=gHV$K(B Hello $B$HF~$k$h$&$K=i4|2=$7$F$$$k!%(B 9$B9TL\$N(B printf $B$G$OJQ49J8;z$K(B %s $B$rMQ$$$F!$J8;zNs$r=PNO$7$F$$$k!%(B $B$3$l$GJ8;z7?G[Ns(B s $B$,J8;zNs$H$J$C$F$$$k$3$H$,$o$+$k!%(B 11$B!A(B14$B9TL\$G$O!$J8;z7?G[Ns(B s $B$N3FMWAG$NJ8;z$r=PNO$7$F$$$k!%(B 12$B9TL\$N(B printf $B$G$OJQ49J8;z$K(B %c $B$rMQ$$$F!$J8;z$r=PNO$7$F$$$k!%(B $B$3$l$r%3%s%Q%$%k

% ./a.out [$B
Hello
[0] = H
[1] = e
[2] = l
[3] = l
[4] = o
%

3$B9TL\$O!$0J2<$N$h$&$K=q$$$F$bF1$8$G$"$k!%(B

     3	char s[] = "Hello";

$B$7$+$7$J$,$i!$0J2<$N(B$B%W%m%0%i%`(B$B$N$h$&$K=q$/$H!$0UL#$,0[$J$C$F$/$k!%(B 3$B9TL\$G$O!$(Bchar $B%]%$%s%?7?$NJQ?t(B ps $B$KJ8;zNs$,BeF~$5$l$F=i4|2=$5$l$F$$$k!%(B $B>e5-$NJ8;z7?G[Ns(B s $B$O!$=i4|CM$H$J$kJ8;zNs$H=*C$C$F!$%W%m%0%i%`Cf$G$3$N%]%$%s%?$rB>$N>l=j$r;X$9$h$&$KJQ99$9$k$3$H$,$G$-$k!%(B $B5U$K!$J8;zNsDj?t$NFbMF$NJQ99$N7k2L$O!J8@8l;EMM>e$O!KITDj$G$"$k!%(B Mac OS X $B$G$O%P%9%(%i!o=*N;$7$F$7$^$&$,!$$G$-$F$7$^$&(BOS$B$b$"$k!%(B

     1	#include <stdio.h>
     2
     3	char *ps = "Hello";
     4
     5	main()
     6	{
     7		int	i = 0;
     8
     9		printf("%s\n", ps);
    10
    11		while (*ps) {
    12			printf("[%d] = %c\n", i, *ps);
    13			i++;
    14			ps++;
    15		}
    16	}

$B>e5-%W%m%0%i%`(B14$B9TL\$G$O%]%$%s%?$r%$%s%/%j%a%s%H$9$k$3$H$K$h$j!$

$B>e5-%W%m%0%i%`(B11$B!A(B15$B9TL\$N(B while $BJ8$O0J2<$N$h$&$K=q$/$3$H$b$G$-$k!%(B $B$$$+$K$b(BC$B$i$7$$%W%m%0%i%`$K$J$k$,!$(Bwhile $BCf$K7+$jJV$9J8$rDI2C$9$k>l9g$K!$4V0c$$$,F~$j$d$9$$$H$$$&7gE@$b$"$k!J$3$N$h$&$K=q$/$Y$-$G$O$J$$$H$$$&0UL#$G$O$J$$!K!%(B

    11		while (*ps)
    12			printf("[%d] = %c\n", i++, *ps++);

$BI8=`F~=PNO(B

C$B8@8l$G$OI8=`F~=PNO$rMQ$$$k$3$H$G!$4pK\E*$JF~=PNO$r9T$&$3$H$,$G$-$k!%(B $BDL>o!$I8=`F~NO$O%-!<%\!<%I$G$"$j!$I8=`=PNO$OC$N%W%m%0%i%`$K@Z$jBX$($k$3$H$,$G$-$k!%(B $B$3$N5!G=$K$h$j!$%U%!%$%k%"%/%;%9$J$7$KMM!9$JF~=PNO$,2DG=$K$J$C$F$$$k!%(B

$BI8=`F~NO$+$i!$J8;z!$9T!$=q<0IU$NF~NO$r9T$&%i%$%V%i%j4X?t$H$7$F0J2<$N$b$N$,$"$k!%(B

int    getchar(void);
char * gets(char *s);
int    scanf(const char *format, ...);

$B$^$?I8=`=PNO$KBP$7!$J8;z!$9T!$=q<0IU$N=PNO$r9T$&%i%$%V%i%j4X?t$H$7$F0J2<$N$b$N$,$"$k!%(B

int    putchar(int c);
int    puts(const char *s);
int    printf(const char *format, ...);

$B$3$l$i$N$&$A(B gets $B$O!$8e$N9V5A$G=R$Y$k(B$B%P%C%U%!%*!<%P!<%U%m!<(B$B$N860x$H$J$k@H scanf $B$b!$(B%s $B$N$h$&$J=q<0;XDj$rMQ$$$k$H!$%P%C%U%!%*!<%P!<%U%m!<$KBP$9$k@H

fgets$B$KBP1~$9$kJ8;z!$9T!$=q<0IU$-$NF~=PNO$r9T$&%i%$%V%i%j4X?t$K$O0J2<$N$b$N$,$"$k!%(B

int    fgetc(FILE *stream);
char * fgets(char *s, int size, FILE *stream);
int    fscanf(FILE *stream, const char *format, ...);
int    fputc(int c, FILE *stream);
int    fputs(const char *s, FILE *stream);
int    fprintf(FILE *stream, const char *format, ...);

stream $B$K(B stdin $B$H=q$/$HI8=`F~NO$K$J$j!$(Bstdout $B$H=q$/$HI8=`=PNO$K$J$k!%(B $B$D$^$j(B fgetc, fgets $B$G$O(B stdin$B!$(Bfputc, fputs, fprintf $B$G$O(B stdout $B$r;XDj$9$k!%(B

$BI8=`F~=PNO$K$O!$I8=`=PNO$G$"$k(B stdout $B$NB>$K!$I8=`%(%i!<=PNO$H8F$P$l$k$b$&0l$D=PNO$N8}$,$"$k!%(B $BI8=`%(%i!<=PNO$O(B stream $B$K(B stderr $B$H=q$/$3$H$G;XDj$G$-$k!%(B $BI8=`%(%i!<=PNO$O!$%(%i!<%a%C%;!<%8$d7Y9p$N%a%C%;!<%8$J$INc30E*$J=hM}$K4X$9$k%a%C%;!<%8$r=PNO$9$k$?$a$K;HMQ$5$l$k!%(B

$B0J2<$O(B getchar $B$K$h$jI8=`F~NO$+$i(B1$BJ8;zFI$_9~$_!$(Bputchar $B$K$h$jI8=`=PNO$X(B1$BJ8;z=q$-=P$9%W%m%0%i%`$G$"$k!%(B

     1	#include <stdio.h>
     2
     3	main()
     4	{
     5		int	c;
     6
     7		while ((c = getchar()) != EOF)
     8			putchar(c);
     9	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
1234567890 [$B
1234567890
abcdefg [$B
abcdefg
[C-D]
%

fgetc, fputc $B$r;HMQ$9$k$H0J2<$N(B$B%W%m%0%i%`(B$B$N$h$&$K$J$k!%(B $B7k2L$O!$(Bgetchar, putchar $B$r;HMQ$7$?>l9g$H!$A4$/F1$8$K$J$k!%(B

     1	#include <stdio.h>
     2
     3	main()
     4	{
     5		int	c;
     6
     7		while ((c = fgetc(stdin)) != EOF)
     8			fputc(c, stdout);
     9	}

$B0J2<$O(B fgets $B$K$h$jI8=`F~NO$+$i(B1$B9TFI$_9~$_!$(Bputs $B$K$h$jI8=`=PNO$X(B1$B9T=q$-=P$9(B$B%W%m%0%i%`(B$B$G$"$k!%(B

     1	#include <stdio.h>
     2	
     3	#define LINE_LEN	80
     4	
     5	main()
     6	{
     7		char	line_buf[LINE_LEN];
     8	
     9		while (fgets(line_buf, LINE_LEN, stdin) != NULL)
    10			puts(line_buf);
    11	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
1234567890[$B
1234567890

abcdefg[$B
abcdefg


[C-D]
%

fgets $B$O2~9TJ8;z$b%P%C%U%!$KFI$_9~$`!%(B $B$=$7$F(B puts $B$,J8;zNs$r=PNO$7$?8e$K2~9T$b=PNO$9$k;EMM$N$?$a!$2~9T$,(B2$B2s=PNO$5$l$F$7$^$$!$M>7W$J6u9T$,=P$F$7$^$&!%(B $B;HMQ$9$k$Y$-$G$O$J$$(B gets $B$O9TKv$N2~9TJ8;z$r%P%C%U%!$KFI$_9~$^$J$$$?$a!$$3$N$h$&$JLdBj$O@8$8$J$+$C$?(B($B$7$+$7(B1$B9T$NJ8;z?t$,%P%C%U%!$NBg$-$5$r1[$($F$7$^$&$H!$$b$C$HBg$-$JLdBj$,@8$8$F$7$^$&(B)$B!%(B

$B0J2<$N(B$B%W%m%0%i%`(B$B$h$&$K(B puts $B$NBe$o$j$K(B fputs $B$r;HMQ$9$k$H!$(Bfputs $B$OC1$K%P%C%U%!Fb$NJ8;zNs$r=q$-=P$9$@$1$N;EMM$N$?$a!$>e5-$NLdBj$O$J$/$J$k!%(B

     1	#include <stdio.h>
     2	
     3	#define LINE_LEN	5
     4	
     5	main()
     6	{
     7		char	line_buf[LINE_LEN];
     8	
     9		while (fgets(line_buf, LINE_LEN, stdin) != NULL)
    10			fputs(line_buf, stdout);
    11	}

$BJ8;z!$J8;zNsA`:n%i%$%V%i%j(B

$BJ8;zA`:n(B

$BJ8;zA`:n$N%i%$%V%i%j4X?t$K$O!$0J2<$NBgJ8;zKt$O>.J8;z$XJQ49$9$k4X?t$H!$(B

int toupper (int c);	/* $BBgJ8;z$XJQ49(B */
int tolower (int c);	/* $B>.J8;z$XJQ49(B */

$B0J2<$NJ8;z$N

int isalnum (int c);	/* $B1Q;zKt$O?t;z!)(B */
int isalpha (int c);	/* $B%"%k%U%!%Y%C%H!)(B */
int isascii (int c);	/* $B%"%9%-!.J8;z!)(B */
int isprint (int c);	/* $BI=<(2DG=!)!J%9%Z!<%9$r4^$`!K(B */
int ispunct (int c);	/* $BI=<(2DG=!)!J%9%Z!<%9$H1Q?t;z$r=|$/!K(B */
int isspace (int c);	/* $B6uGrJ8;z!)!J%9%Z!<%9!$%?%V!$2~9TJ8;z$J$I!K(B */
int isupper (int c);	/* $BBgJ8;z!)(B */
int isxdigit (int c);	/* 16$B?J?t$G$N?t;z!)!J(B0$B!A(B9, a$B!A(Bf, A$B!A(BF$B!K(B */

$B0J2<$N(B$B%W%m%0%i%`(B$B$O>.J8;z$rBgJ8;z$X!$BgJ8;z$O>.J8;z$XJQ49$9$k!%(B

     1	#include <stdio.h>
     2	#include <ctype.h>
     3
     4	main()
     5	{
     6		int	c;
     7
     8		while ((c = getchar()) != EOF) {
     9			if (islower(c))
    10				c = toupper(c);
    11			else if (isupper(c))
    12				c = tolower(c);
    13			putchar(c);
    14		}
    15	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
a[$B
A
b[$B
B
abcdefgABCDEFG[$B
ABCDEFGabcdefg
[C-D]
%

$BJ8;zNsA`:n(B

string(3) $B$KJ8;zNsA`:n$N$?$a$N%i%$%V%i%j4X?t0lMw$,$N$C$F$$$k!J(Bman 3 string$B$GI=<(2DG=!K!%(B $BHf3SE*NI$/;H$o$l$k4X?t$K$D$$$F2r@b$9$k!%(B

man 3 string $B$r8+$k$H!$4X?t$N%j%9%H$K4^$^$l$F(B

#include <string.h>

$B$H$G$F$$$k!%(B $BF1$8$3$H$O!$8DJL$N4X?t$N%^%K%e%"%k%Z!<%8$K$b$G$F$$$k!%(B $B$3$l$O!$$3$l$i$N4X?t$r;HMQ$9$k;~$K$O(B string.h $B$r%$%s%/%k!<%I$7$J$5$$$H$$$&0UL#$G$"$k!%(B $B;XDj$5$l$?%X%C%@%U%!%$%k$r%$%s%/%k!<%I$7$J$$$H!$%(%i!<$K$h$j%3%s%Q%$%k$G$-$J$$>l9g!$Kt$O4X?t$,@5>o$KF0:n$7$J$$>l9g$,$"$k!%(B

$BJ8;zNs$ND9$5(B

size_t strlen(const char *s);

strlen $B$OJ8;zNs$ND9$5$rLa$jCM$H$7$FJV$9!%(B $BJ8;zNs$N=*C

$B0J2<$N(B$B%W%m%0%i%`(B$B$O!$(B getchar, putchar $B$rMQ$$$?>.J8;z$rBgJ8;z$X!$BgJ8;z$O>.J8;z$XJQ49$9$k(B$B%W%m%0%i%`(B$B$r!$(Bfgets, fputs $B$rMQ$$$F9T$4$H$NF~=PNO$K$9$k$H!$J8;zNs$KBP$7!$BgJ8;z!$>.J8;z$NJQ49$r$9$k$h$&$K$J$k!%(B $BJ8;zNs$K4^$^$l$kJ8;z$r@hF,$+$i8+$F$$$/$?$a$K$O!$J8;zNs$ND9$5$,I,MW$K$J$k$?$a!$(Bstrlen $B$r;HMQ$9$k!%(B

     1	#include <stdio.h>
     2	#include <ctype.h>
     3	#include <string.h>
     4
     5	#define LINE_LEN	80
     6
     7	main()
     8	{
     9		int	i, len;
    10		char	line_buf[LINE_LEN];
    11		char	*p;
    12
    13		while (fgets(line_buf, LINE_LEN, stdin) != NULL) {
    14			len = strlen(line_buf);
    15			p = line_buf;
    16			for (i = 0; i < len; i++, p++) {
    17				if (islower(*p))
    18					*p = toupper(*p);
    19				else if (isupper(*p))
    20					*p = tolower(*p);
    21			}
    22			fputs(line_buf, stdout);
    23		}
    24	}

$B$BN}=,LdBj!J#1#3!K(B -->

$BJ8;zNs$NHf3S(B

int    strcmp(const char *s1, const char *s2);
int    strncmp(const char *s1, const char *s2, size_t n);
int    strcasecmp(const char *s1, const char *s2);
int    strncasecmp(const char *s1, const char *s2, size_t n);

$B$3$l$i$O(B2$B$D$NJ8;zNs(B s1 $B$H(B s2 $B$rHf3S$7!$(B
$B>r7o(B$B!!La$jCM(B
s1
<
s2$B!!(B0$B$h$j>.$5$$?t(B
s1
==
s2$B!!(B0
s1
>
s2$B!!(B0$B$h$jBg$-$$?t(B
$B$H$$$&7k2L$rJV$9!%(B $BJ8;z$NBg>.4X78$O(BASCII$B%3!<%I(B$B$G$NBg>.$G$"$k!%(B

strncmp, strncasecmp $B$O(B s1 $B$N@hF,(B n $BJ8;z$K$D$$$F$N$_!$Hf3S$r9T$&!%(B

strcasecmp, strncasecmp $B$OBgJ8;z!$>.J8;z$r6hJL$;$:$K!JNc$($P(B A $B$H(B a $B$OF1$8$H$_$J$7$F!KHf3S$9$k!%(B

$BJ8;z$dJ8;zNs$N8!:w(B

char * strchr(const char *s, int c);
char * strrchr(const char *s, int c);
char * index(const char *s, int c);
char * rindex(const char *s, int c);
char * strstr(const char *haystack, const char *needle);

strchr, index $B$O!$J8;zNs(B s $B$r@hF,$+$iC5$7$F:G=i$K(B c $B$NJ8;z$,8=$l$?$H$3$m$X$N%]%$%s%?$rJV$9!%(B

strrchr, rindex $B$O!$J8;zNs(B s $B$r:G8eHx$+$iC5$7$F:G=i$K(B c $B$NJ8;z$,8=$l$?$H$3$m$X$N%]%$%s%?$rJV$9!%(B

strstr $B$O!$J8;zNs(B haystack $B$r@hF,$+$iC5$7$F!$:G=i$K(B needle $B$,8+$D$+$C$?$H$3$m$X$N%]%$%s%?$rJV$9!%(B

$B$I$l$b!$8+$D$+$i$J$+$C$?>l9g$O(B NULL $B$,La$jCM$K$J$k!%(B

$B0J2<$N(B$B%W%m%0%i%`(B$B$O!$%U%!%$%k$X$N%Q%9$N9=@.MWAG$r@Z$j=P$7$F=PNO$9$k!%(B

     1	#include <stdio.h>
     2	#include <string.h>
     3	#include <sys/param.h>
     4
     5	main()
     6	{
     7		int	i;
     8		char	line_buf[MAXPATHLEN];
     9		char	*p, *np;
    10
    11		while (fgets(line_buf, MAXPATHLEN, stdin) != NULL) {
    12			i = 0;
    13			p = line_buf;
    14			while ((np = index(p, '/')) != NULL) {
    15				*np = '\0';
    16				printf("%d: %s\n", i++, p);
    17				p = np + 1;
    18			}
    19			printf("%d: %s\n", i, p);
    20		}
    21	}

8$B9TL\$N(B MAXPATHLEN $B$O!$%7%9%F%`$GDj5A$5$l$F$$$k%Q%9L>$N:GBgD9$G$"$k!%(B MAXPATHLEN $B$O(B sys/param.h $B$GDj5A$5$l$F$$$k!%(B $B$3$l$r%3%s%Q%$%k

% ./a.out [$B
dir0/dir1/dir2/dir3/file[$B
0: dir0
1: dir1
2: dir2
3: dir3
4: file

[C-D]
%

$B$3$N%W%m%0%i%`$O(B1$B$D$NJ8;zNsCf$K4^$^$l$k(B '/' $B$r(Bindex$B$rMQ$$$F8!:w$7!$8+$D$+$C$?$i!$$=$NJ8;z$r(B '\0' $B$KCV$-49$($k!%(B $BJ8;zNs$H$O=*C

$B2

$BJ8;z$NCV49(B

$B$3$N$h$&$KJ8;zNs$r%3%T!<$9$k$3$H$J$/!$J8;zNs$N0lIt$r@Z$j=P$9$3$H$,$G$-$k!%(B

$BJ8;zNs$N%3%T!
size_t strlcpy(char *dst, const char *src, size_t size);
size_t strlcat(char *dst, const char *src, size_t size);

strlcpy $B$O(B src $B$NJ8;zNs$r(B dst $B$K%3%T!<$9$k!%(B strlcat $B$O(B src $B$NJ8;zNs$r(B dst $B$NJ8;zNs$N8e$m$K!J(Bdst $B$N=*Cl9g(B dst $B$O%3%T!<@h$N%P%C%U%!$N%5%$%:$G$"$k$,!$(B strlcat $B$N>l9g(B dst $B$O$9$G$KF~$C$F$$$kJ8;zNs$ND9$5$b4^$s$@%P%C%U%!$N%5%$%:$G$"$k!%(B

strlcpy, strlcat $B$O!$(Bsrc $B$NJ8;zNs$rA4$F%3%T!<$G$-$?$+$I$&$+$K4X$o$i$:!$(Bdst $B$NJ8;zNs$K=*C<$N(B 0 $B$rIU$1$k!%(B $B=>$C$F!$(Bstrlcpy $B$O:GBg(B size - 1 $BJ8;z%3%T!<$7!$(Bstrlcat $B$O:GBg(B size - strlen(dst) - 1 $BJ8;z%3%T!<$9$k!%(B

strlcpy, strlcat $B$O!$$=$l$i$,:n@.$7$h$&$H$7$?J8;zNs$ND9$5$rLa$jCM$H$7$FJV$9!%(B $BB($A!$(Bstrlcpy $B$N>l9g!$$=$l$O(B src $B$ND9$5!J(Bstrlen(src)$B!K$G$"$j!$(Bstrlcat$B$N>l9g(B dst $B$H(B src $B$ND9$5$NOB$G$"$k!%(B

$B0J2<$O(B strlcpy, strlcat $B$r;HMQ$7$FJ8;zNs$N%3%T!<$r9T$&Nc$G$"$k!%(B $B%3%T!<@h$N%P%C%U%!$NBg$-$5$O(B sizeof $B1i;;;R$K$h$j

     1	#include <stdio.h>
     2	#include <string.h>
     3
     4	main()
     5	{
     6		char	buf5[5];
     7		char	buf20[20];
     8		char	*d = "01234567890";
     9		char	*s = "abcdefghijklmnopqrstuvwxyz";
    10		int	i;
    11
    12		i = strlcpy(buf5, d, sizeof(buf5));
    13		printf("cpy  5: src(%s) len(%d) dst(%s) len(%d)\n",
    14		    d, i, buf5, strlen(buf5));
    15
    16		i = strlcpy(buf20, d, sizeof(buf20));
    17		printf("cpy 20: src(%s) len(%d) dst(%s) len(%d)\n",
    18		    d, i, buf20, strlen(buf20));
    19
    20		i = strlcat(buf20, s, sizeof(buf20));
    21		printf("cat 20: dst(%s) len(%d)\n", buf20, strlen(buf20));
    22	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
cpy  5: src(01234567890) len(11) dst(0123) len(4)
cpy 20: src(01234567890) len(11) dst(01234567890) len(11)
cat 20: dst(01234567890abcdefgh) len(19)
%

dst $B$KMQ0U$5$l$F$$$k%P%C%U%!$ND9$5$rD6$($F%3%T!<$5$l$F$$$J$$$3$H$,$o$+$k!%(B

strlcpy$B!$(Bstrlcat $B$OA4$F$N(BUNIX$B$GMQ0U$5$l$F$$$k$o$1$G$O$J$$!%(B $B;HMQ$G$-$J$$>l9g$O!$0J2<$N4X?t$r;HMQ$9$k$7$+$J$$$,!$%P%C%U%!%*!<%P!<%U%m!<$KBP$9$k@H

char * strncpy(char *dst, const char *src, size_t n);
char * strncat(char *dst, const char *src, size_t n);
char * strcpy(char *dst, const char *src);
char * strcat(char *dst, const char *src);

strncpy $B$O(B src $B$NJ8;zNs$r=*Cl9g!$(Bdst $B$N;D$j$NItJ,$O(B 0 $B$GKd$a$k!%(B

strcpy $B$O(B src $B$NJ8;zNs$r=*C

strncpy, strncat, strcpy, strcat $B$NLa$jCM$OC1$K(B dst $B$G$"$k!%(B strlcpy, strlcat $B$H0[$J$j!$A4$F$N(B src $B$NJ8;zNs$,%3%T!<$G$-$?$N$+$I$&$+$O!$La$jCM$+$i$OITL@$G$"$k!%(B

strcat, strcpy $B$O!$%3%T!<@h$NBg$-$5$r;XDj$G$-$J$$$?$a!$%P%C%U%!%*!<%P!<%U%m!<$KBP$9$k@H

$BJ8;zNs$N%3%T!

printf $B$NCg4V$N4X?t$G$"$k(B snprintf $B$rMQ$$$k$3$H$G$bJ8;zNs$N%3%T!

int snprintf(char *dst, size_t size, const char *format, ...);

snprintf $B$O(B printf $B$H$[$\F1$8$h$&$K;HMQ$G$-$k$,!$7k2L$O(B dst $B$KJ8;zNs$H$7$F3JG<$5$l$k!%(B size $B$O%P%C%U%!(B dst $B$N%5%$%:$G$"$k!%(B $B=*C

snprintf $BLa$jCM$O!$$b$7=PNO%P%C%U%!$,L58BBg$G$"$C$?>l9g$K2?J8;z=PNO$5$l$?$+!J=*C

$B>e5-$N(B strlcpy, strlcat $B$r;HMQ$7$?%W%m%0%i%`$r(B snprintf $B$rMQ$$$F=q$-D>$9$H0J2<$N$h$&$K$J$k!%(B 20$B9TL\$NJ8;zNs$N7k9g$,!$$b$H$K$J$kJ8;zNs$+$i%3%T!<$7$F$$$k$H$3$m$@$1$,0[$J$k!%(B

     1	#include <stdio.h>
     2	#include <string.h>
     3
     4	main()
     5	{
     6		char	buf5[5];
     7		char	buf20[20];
     8		char	*d = "01234567890";
     9		char	*s = "abcdefghijklmnopqrstuvwxyz";
    10		int	i;
    11
    12		i = snprintf(buf5, sizeof(buf5), "%s", d);
    13		printf("cpy  5: src(%s) len(%d) dst(%s) len(%d)\n",
    14		    d, i, buf5, strlen(buf5));
    15
    16		i = snprintf(buf20, sizeof(buf20), "%s", d);
    17		printf("cpy 20: src(%s) len(%d) dst(%s) len(%d)\n",
    18		    d, i, buf20, strlen(buf20));
    19
    20		i = snprintf(buf20, sizeof(buf20), "%s%s", d, s);
    21		printf("cat 20: dst(%s) len(%d)\n", buf20, strlen(buf20));
    22	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
cpy  5: src(01234567890) len(11) dst(0123) len(4)
cpy 20: src(01234567890) len(11) dst(01234567890) len(11)
cat 20: dst(01234567890abcdefgh) len(19)
%

snprintf $B$O(B printf $B$HF1$8$h$&$K%U%)!<%^%C%H$,$G$-$k$?$a!$?tCM$NJ8;zNs$X$NJQ49$HJ8;zNs$N7k9g$J$I$r:.:_$7$F9T$($k$N$,JXMx$G$"$k!%(B

$B$=$NB>$NJ8;zNsA`:n4X?t(B

char * strdup(const char *s);			     /* $BJ8;zNs$NJ#@=(B */
char * strfry(char *string);			     /* $BJ8;zNs$N%i%s%@%`2=(B */
char * strsep(char **stringp, const char *delim);    /* $B%H!<%/%s$N@Z$j=P$7(B */
char * strtok(char *s, const char *delim);	     /* $B%H!<%/%s$X$NJ,2r(B */
size_t strcspn(const char *s, const char *reject);   /* $BJ8;z%;%C%H$K4^$^$l$J$$J8;z?t(B */
char * strpbrk(const char *s, const char *accept);   /* $BJ8;z%;%C%H$K4^$^$l$kJ8;z$N8!:w(B */
size_t strspn(const char *s, const char *accept);    /* $BJ8;z%;%C%H$K4^$^$l$kJ8;z?t(B */
int    strcoll(const char *s1, const char *s2);	     /* $B%m%1!<%k$K4p$E$/J8;zNsHf3S(B */
size_t strxfrm(char *dst, const char *src, size_t n);  /* $B%m%1!<%k$K4p$E$$$?J8;zNsJQ49(B */

$BJ8;zNs$H?tCM$NJQ49(B

getchar$B$d(Bfgets$B$G?t;z$rF~NO$H$7$F

$B0J2<$OJ8;zNs$r?tCM$KJQ49$7$F$/$l$k%i%$%V%i%j4X?t$G$"$k!%(B sscanf $B$O(B scanf $B$HF1$8%P%C%U%!%*!<%P!<%U%m!<$KBP$9$k@H

long int	  strtol(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
double		  strtod(const char *nptr, char **endptr);
long		  atol(const char *nptr);
int		  atoi(const char *nptr);
double		  atof(const char *nptr);
int		  sscanf(const char *str, const char *format, ...);

$B?tCM$rJ8;zNs$KJQ49$9$k%i%$%V%i%j4X?t$H$7$F(B sprintf, snprintf $B$,;HMQ$G$-$k!%(B sprintf $B$O!$Hs>o$KCm0U?<$/;HMQ$7$J$1$l$P!$%P%C%U%!%*!<%P!<%U%m!<$r5/$3$94m81$,$"$k!%(B snprintf $B$O=q$-=P$9:GBgJ8;z?t$r;XDj$G$-$k$N$G!$(Bsprintf $B$KBe$o$C$F>o$K(B snprintf $B$r;HMQ$9$Y$-$G$"$k!%(B $B$7$+$7(B snprintf $B$b(B snprintf $B$O(B sprintf $B$r8F$S=P$7$F$$$k$@$1$N$3$H$,$"$j!$0BA4$G$O$J$$$3$H$,$"$k$N$GCm0U$,I,MW$G$"$k!%(B

int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const  char  *format, ...);

$B%]%$%s%?!J#2!K(B

$BF0E*%a%b%j3NJ](B

malloc $B$K$h$j!$l9g!$$=$NNN0h$K%"%/%;%9$9$k$K$O!$%]%$%s%?$r;HMQ$9$kI,MW$,$"$k!%(B $BF0E*%a%b%j3NJ]$O!$l9g!$0l;~E*$KBg$-$J%5%$%:$N%a%b%j$r3NJ]$9$kI,MW$,$"$k>l9g$J$I$KJXMx$J5!G=$G$"$k!%(B $B$7$+$7!$Cm0U$9$Y$-E@$bB?$/!$4V0c$C$F;HMQ$9$k$HH/8+$7$K$/$$%P%0$N860x$H$J$C$F$7$^$&!%(B

malloc$B$H(Bfree

malloc $B$O%R!<%WNN0h$KF0E*$K=i4|2=$5$l$F$$$J$$%a%b%j$r3NJ]$7!$$=$3$X$N%]%$%s%?CM$rJV$9!%(B calloc $B$O(B0$B$K=i4|2=$5$l$?%a%b%j$r3NJ]$7!$$=$3$X$N%]%$%s%?CM$rJV$9!%(B free $B$O(B malloc $B$K$h$j3NJ]$5$l$?%a%b%j$r2rJ|$9$k!%(B

#include <stdlib.h>

void *malloc(size_t size);
void *calloc(size_t count, size_t size);
void  free(void *ptr);

malloc $B$K$h$j3NJ]$5$l$?%a%b%j$NFbMF$OITDj$G$"$j!$(B0 $B$K=i4|2=$5$l$F$$$k$o$1$G$O$J$$!%(B $B0lJ}!$(Bcalloc $B$K$h$j3NJ]$5$l$?%a%b%j$NFbMF$O(B 0 $B$G$"$k!%(B $B$^$?!$(Bfree $B$O2rJ|$9$k%a%b%j$NFbMF$r>C5n$7$J$$!%(B

malloc $B$G3NJ]$5$l$?%a%b%jNN0h$O!$$=$N%]%$%s%?CM$r!$4X?t$N0z?t!$La$jCM!$Bg0hJQ?t$J$I$+$iF@$k$3$H$,=PMh$l$P!$%W%m%0%i%`Cf$N$I$3$G$b;HMQ$G$-$k!%(B $BBg0hJQ?t$N$?$a$NNN0h$O!$%3%s%Q%$%k;~$K$=$NBg$-$5$,7h$^$j!$%W%m%0%i%`u67$+$i7W;;$K$h$j5a$a$?CM$r;XDj$9$k$3$H$G!$I,MW$J$@$1$N%a%b%j$r3NJ]$G$-$k!%(B $B>r7o$K$h$j(B malloc $B$,8F$P$l$J$1$l$P!$$=$N%a%b%jNN0h$O3NJ]$5$l$J$$!%(B

strlcpy, strlcat $B$r;HMQ$7$FJ8;zNs$N%3%T!<$r9T$&%W%m%0%i%`(B$B$r!$%m!<%+%kJQ?t$GG[Ns$r@k8@$9$k$N$G$O$J$/!$(Bmalloc $B$rMQ$$$F=q$-D>$9$H0J2<$N$h$&$K$J$k!%(B $BG[NsL>$@$1$r;XDj$9$k>l9g$H!$%]%$%s%?JQ?t$O$[$\F1$8$h$&$K;HMQ$G$-$k$?$a!$Hs>o$K;wDL$C$?%W%m%0%i%`$K$J$k$,!$0J2<$NCm0UE@!$Aj0cE@$,$"$k!%(B

  • malloc $B$ONN0h$r3NJ]$G$-$J$$>l9g$K(BNULL$B$rJV$9$?$a!$$=$N%A%'%C%/$rK:$l$J$$$h$&$K$9$k!J(B14~17$B!$(B20~23$B9TL\!K!%(B
  • $B$9$0$K%W%m%0%i%`$,=*N;$7$F$7$^$&$?$ae$N0UL#$O$J$$$,!$(B36, 37$B9TL\$G3NJ]$7$?NN0h$r(B free $B$K$h$j3+J|$7$F$$$k!%(B

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <string.h>
     4  
     5  main()
     6  {
     7          char    *buf5;
     8          char    *buf20;
     9          char    *d = "01234567890";
    10          char    *s = "abcdefghijklmnopqrstuvwxyz";
    11          int     i;
    12  
    13          buf5 = malloc(5);
    14          if (buf5 == NULL) {
    15                  perror("malloc");
    16                  exit(1);
    17          }
    18  
    19          buf20 = malloc(20);
    20          if (buf20 == NULL) {
    21                  perror("malloc");
    22                  exit(1);
    23          }
    24  
    25          i = strlcpy(buf5, d, 5);
    26          printf("cpy  5: src(%s) len(%d) dst(%s) len(%d)\n",
    27              d, i, buf5, strlen(buf5));
    28  
    29          i = strlcpy(buf20, d, 20);
    30          printf("cpy 20: src(%s) len(%d) dst(%s) len(%d)\n",
    31              d, i, buf20, strlen(buf20));
    32  
    33          i = strlcat(buf20, s, 20);
    34          printf("cat 20: dst(%s) len(%d)\n", buf20, strlen(buf20));
    35  
    36          free(buf5);
    37          free(buf20);
    38  }

$BG[Ns$O(B sizeof $B1i;;;R$G$=$NG[Ns$NBg$-$5$rl9g!$$=$NJQ?t$NBg$-$5$K$J$C$F$7$^$&$3$H$KCm0U$9$k!%(B $B=>$C$F!$(Bstrlcpy, strlcat $B$KEO$9%3%T!<@h$N%P%C%U%!$NBg$-$5$O(B malloc $B$G;XDj$7$?Bg$-$5$r=q$/I,MW$,$"$k!J(B25$B!$(B29$B9TL\!K!%(B $B0J2<$N$h$&$K%]%$%s%?7?JQ?t$K(B sizeof $B1i;;;R$r;HMQ$7$F$b!$3NJ]$7$h$&$H$9$k!J$^$?$O3NJ]$7$?!KNN0h$NBg$-$5$K$O$J$i$J$$!%(B

    13          buf5 = malloc(sizeof(buf5));
    25          i = strlcpy(buf5, d, (buf5));

$B;HMQ>e$NCm0U(B

malloc $B$G3NJ]$7$?%a%b%j$O!$3NJ]$7$?%5%$%:$@$1;HMQ$9$k!%(B C$B8@8l$G$OG[Ns$N%$%s%G%C%/%9!JE:;z!K$,@k8@$5$l$?G[Ns$N%5%$%:$NHO0O$K<}$^$C$F$$$k$+%A%'%C%/$7$J$$$N$HF1$8$h$&$K!$(Bmalloc $B$G3NJ]$7$?%a%b%j$,3NJ]$5$l$?HO0OFb$G;HMQ$5$l$F$$$k$+$I$&$+$N%A%'%C%/$b$7$J$$!%(B $B3NJ]$7$?%5%$%:$rD6$($F%"%/%;%9$7$?>l9g!$3NJ]$7$?%5%$%:$duBV$K$h$j!$%;%0%a%s%F!<%7%g%s%U%)%k%H$,5/$-$k$3$H$b$"$jF@$k$7!$%"%/%;%9$G$-$F$7$^$&$3$H$b$"$k!%(B

$B0J2<$O!$>e5-$N%W%m%0%i%`$N(Bbuf20$B$r(Bbuf5$B$KCV$-49$($F!$3NJ]$7$?%5%$%:$rD6$($F%"%/%;%9$7$?Nc$G$"$k!%(B 25, 29$B9TL\$G!$(Bbuf20$B$rMQ$$$k$Y$-$H$3$m$r(Bbuf5$B$K=q$-9~$s$G$*$j!$3NJ]$7$?%5%$%:0J>e$K=q$-9~$s$G$$$k!%(B buf20$B$NJ}$O!$(B23$B9TL\$G(B bzero $B$K$h$jFbMF$r(B0$B$K=i4|2=$7!$(Bbuf5$B$K3NJ]$7$?%5%$%:0J>e$K=q$-9~$s$@7k2L$I$&$J$k$+!$(B32$B9TL\$G=PNO$7$F%A%'%C%/$7$F$$$k!%(B

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <string.h>
     4  
     5  main()
     6  {
     7          char    *buf5, *buf20;
     8          char    *d = "01234567890";
     9          char    *s = "abcdefghijklmnopqrstuvwxyz";
    10          int     i;
    11  
    12          buf5 = malloc(5);
    13          if (buf5 == NULL) {
    14                  perror("malloc");
    15                  exit(1);
    16          }
    17  
    18          buf20 = malloc(20);
    19          if (buf5 == NULL) {
    20                  perror("malloc");
    21                  exit(1);
    22          }
    23          bzero(buf20, 20);
    24  
    25          i = strlcpy(buf5, d, 20);
    26          printf("cpy 20: src(%s) len(%d) dst(%s) len(%d)\n",
    27              d, i, buf5, strlen(buf5));
    28  
    29          i = strlcat(buf5, s, 20);
    30          printf("cat 20: dst(%s) len(%d)\n", buf5, strlen(buf5));
    31  
    32          printf("buf 20: dst(%s) len(%d)\n", buf20, strlen(buf20));
    33  
    34          free(buf5);
    35          free(buf20);
    36	}

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
cpy 20: src(01234567890) len(11) dst(01234567890) len(11)
cat 20: dst(01234567890abcdefgh) len(19)
buf 20: dst(fgh) len(3)
%

$B%"%/%;%9$G$-$F$7$^$&$H!$F0$$$?$jF0$+$J$+$C$?$j!$$^$?%G!<%?GK2u$,5/$3$C$?$j5/$3$i$J$+$C$?$j$9$k$?$a!$$o$+$j$K$/$$%P%0$K$J$k$?$aCm0U$,I,MW$G$"$k!%(B $B3NJ]$7$?%5%$%:$@$1;HMQ$9$k$9$k$h$&$K>o$K0U<1$7$F;HMQ$9$kI,MW$,$"$k!%(B

free $B8e$N8m;HMQ(B

malloc $B$G3NJ]$7$?%a%b%j$r(B free $B$7$?8e$O!$$=$N%a%b%j$K%"%/%;%9$9$k$H2?$,5/$3$k$+$OITDj$G$"$k!%(B $B%"%/%;%9;~$K%(%i!<$K$J$k>l9g$b$"$k$,!$:FMxMQ$5$lJL$N2U=j$G;HMQ$5$l$F$$$k$3$H$b$"$k$N$G!$$=$N>l9g$O%G!<%?GK2u$r5/$3$7!$$o$+$j$K$/$$LdBj$r0z$-5/$3$9!%(B

$B2rJ|8e$K%]%$%s%?JQ?t$K(BNULL$B$rBeF~$7$F$*$/$3$H$G!$$"$kDxEY$O8m$C$?%]%$%s%?$N;HMQ$rKI$0$3$H$,$G$-$k!%(B $B0J2<$NNc$G$O!$(B2$B9TL\$G(Bbuf5$B$,;2>H$9$k%a%b%j$r2rJ|8e!$(B3$B9TL\$G(Bbuf5$B$K(BNULL$B$rBeF~$9$k!%(B 4$B9TL\$K(Bbuf5$B$N;2>H@h$K%3%T!<$7$h$&$H$9$k$H!$

     1          buf5 = malloc(5);
     2          free(buf5);
     3          buf5 = NULL;
     4          i = strlcpy(buf5, d, 5);

$B$7$+$7!$0J2<$NNc$N$h$&$K!$JL$N4X?t(B func_to_free $B$G(B free $B$,8F$P$l2rJ|$5$l$F$7$^$&$h$&$J>l9g!$(Bfunc_to_free $B$G(B free $B8e$K>e5-$N$h$&$K(BNULL$B$rBeF~$7$F$$$F$b!$8F$S=P$7$b$H$G$O$=$l$OL50UL#$J$?$aCm0U$,I,MW$G$"$k!%(B

     1          buf5 = malloc(5);
     2          func_to_free(buf5);     // free(buf5);
     3          i = strlcpy(buf5, d, 5);

$B%a%b%j%j!<%/(B

$B%a%b%j%j!<%/$H$O!$3NJ]$7$?%a%b%j$N2rJ|$rK:$l!$;HMQ$7$F$*$i$:;HMQ$9$kM=Dj$b$J$$$N$K!$3NJ]$7$?$^$^$K$J$C$F$$$k>uBV$r;X$9!%(B $B%a%b%j%j!<%/$,7+$jJV$75/$-$?>l9g!$BgNL$K%a%b%j$,O2Hq$5$l$?>uBV$K$J$k!%(B $B:G=*E*$K$O!$%a%b%j3NJ]$,$G$-$J$/$J$k!%(B $B%a%b%j%j!<%/$b!$>e5-$NLdBj$HF1$8$/!$%W%m%0%i%`$O0l8+@5>o$KF0$$$F$$$k$h$&$K8+$($F$7$^$&!%(B $B$7$+$7!$D94|4VF0:n$9$k%W%m%0%i%`$G!$7nC10L!$G/C10L$GLdBj$,C_@Q$5$l$?7k2L5/$3$k$3$H$b$"$j!$Hs>o$KH/8+$,Fq$7$$%P%0$G$"$k!%(B $B$=$N$?$a!$>o$K5$$r$D$1$F%W%m%0%i%_%s%0$r$9$kI,MW$,$"$k!%(B

$B0J2<$O!$Hs>o$KC1=c$J%a%b%j%j!<%/$r5/$3$9%W%m%0%i%`$NNc$G$"$k!%(B 12$B9TL\$G3NJ]$7$?NN0h$X$N%]%$%s%?$r(Bbuf$B$KF~$l!$(B18~20$B9TL\$G;HMQ$7$F$$$k!%(B $B$3$NNN0h$r3+J|$;$:$K!$(B22$B9TL\$GF1$8JQ?t$KJL$K3NJ]$7$?NN0h$X$N%]%$%s%?$rF~$l$F$7$^$C$F$$$k!%(B $B$3$&$9$k$H!$(B12$B9TL\$G3NJ]$7$?NN0h$X$N%]%$%s%?$,<:$o$l$F$7$^$$!$2rJ|$9$k$3$H$,$G$-$J$/$J$C$F$7$^$&!%(B

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <string.h>
     4  
     5  main()
     6  {
     7          char    *buf;
     8          char    *d = "01234567890";
     9          char    *s = "abcdefghijklmnopqrstuvwxyz";
    10          int     i;
    11  
    12          buf = malloc(5);
    13          if (buf == NULL) {
    14                  perror("malloc");
    15                  exit(1);
    16          }
    17  
    18          i = strlcpy(buf, d, 5);
    19          printf("cpy  5: src(%s) len(%d) dst(%s) len(%d)\n",
    20              d, i, buf, strlen(buf));
    21  
    22          buf = malloc(20);
    23          if (buf == NULL) {
    24                  perror("malloc");
    25                  exit(1);
    26          }
    27  
    28          i = strlcpy(buf, d, 20);
    29          printf("cpy 20: src(%s) len(%d) dst(%s) len(%d)\n",
    30              d, i, buf, strlen(buf));
    31  
    32          free(buf);
    33	}

$B

$B%U%!%$%k%"%/%;%9(B

$B%U%!%$%k%"%/%;%9$r$9$kJ}K!$K$O!$%7%9%F%`%3!<%k$rMQ$$$kJ}K!$H!$%i%$%V%i%j4X?t$rMQ$$$kJ}K!$,$"$k!%(B $B$I$A$i$K$;$h

$B%i%$%V%i%j$rMQ$$$?%U%!%$%k$H$NF~=PNO(B

$B%i%$%V%i%j$rMQ$$$F%U%!%$%k%"%/%;%9$r9T$&$?$a$K!$%U%!%$%k$r3+$-!$JD$8$k$?$a$K$O(B fopen, fclose $B$rMQ$$$k!%(B $BFI$_=q$-$N$?$a$K$O!$$BI8=`F~=PNO(B$B$G=R$Y$?4X?t$N$&$A!$@hF,$K(B f $B$,$D$$$F$$$k4X?t$,;HMQ$G$-$k!%(B $B0z?t$G;XDj$G$-$k(B FILE *stream $B$r!$(Bstdin, stdout $B$NBe$o$j$K!$(Bfopen $B$NLa$jCM$H$7$FF@$i$l$kCM$K$9$l$P$h$$!%(B $B%U%!%$%k$+$i$NF~=PNO$KJXMx$J$h$&$K(B fread, fwrite $B$H$$$&4X?t$bMQ0U$5$l$F$$$k!J$3$l$i$bI8=`F~=PNO$GMQ$$$k$3$H$,$G$-$k!K!%(B

FILE * fopen(const char *path, const char *mode);
int    fclose(FILE *stream);
size_t fread(void  *ptr,  size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t  nmemb, FILE *stream);

FILE$B9=B$BN(B

$B%U%!%$%k$r3+$/$?$a$K;HMQ$9$k(B fopen $B$NLa$jCM$N7?$O(B FILE * $B!J(BFILE$B9=B$BN$X$N%]%$%s%?!K$G$"$k!%(B 1$BJ8;zF~NO$N(B fgetc $B$O!$FI$_9~$_@h$H$7$F0z?t$K(B FILE * $B7?$NJQ?t$r;XDj$7!$(B1$BJ8;z=PNO$N(B fputc $B$O0z?t$KJ8;z$NB>$K=q$-9~$_@h$H$7$F(B FILE * $B7?$NJQ?t$r;XDj$9$k!%(B

$B$D$^$j!$%i%$%V%i%j$rMQ$$$F%U%!%$%k%"%/%;%9$r9T$&$?$a$K$O!$(BFILE$B9=B$BN$X$N%]%$%s%?!JDL>N!$%U%!%$%k%]%$%s%?!K$,!$%U%!%$%k$NBeM}?M$N$h$&$J$b$N$K$J$k!%(B

FILE$B9=B$BN$K$O!$FI$_=q$-$7$F$$$k%U%!%$%k!$%U%!%$%k$KBP$75v$5$l$kA`:n!JFI$_9~$_!$=q$-9~$_!$Kt$ON>J}!K!$8=:_%U%!%$%k$N$I$NItJ,$r%"%/%;%9$7$F$$$k$N$+!$%(%i!<$O5/$-$F$$$J$$$+!$$J$I$N>pJs$r;}$D!%(B $B%U%!%$%k%]%$%s%?$O!$$3$N%G!<%?9=B$BN$X$N%]%$%s%?$K$J$C$F$*$j!$F~=PNO$K$"$?$C$F%U%!%$%k%]%$%s%?$r;XDj$9$k$3$H$G!$FI$_=q$-$r9T$&$3$H$,$G$-$k$h$&$K$J$C$F$$$k!%(B

$B%U%!%$%k$N%3%T!<(B

fgetc, fputc $B$rMQ$$$FI8=`F~NO$+$iFI$_9~$_!$I8=`=PNO$X=q$-=P$9(B$B%W%m%0%i%`(B$B$O!$(Bfopen, fclose $B$rA08e$KF~$l$k$3$H$G!$4JC1$K%U%!%$%k$N%3%T!<$r9T$&(B$B%W%m%0%i%`(B$B$K$J$k!%(B

     1	#include <stdio.h>
     2	#include <stdlib.h>
     3
     4	main()
     5	{
     6		int	c;
     7		FILE	*src, *dst;
     8
     9		src = fopen("src", "r");
    10		if (src == NULL) {
    11			perror("src");
    12			exit(1);
    13		}
    14
    15		dst = fopen("dst", "w");
    16		if (dst == NULL) {
    17			perror("dst");
    18			fclose(src);
    19			exit(1);
    20		}
    21
    22		while ((c = fgetc(src)) != EOF)
    23			fputc(c, dst);
    24
    25		fclose(src);
    26		fclose(dst);
    27	}

2$B9TL\$N(B stdlib.h $B$O!$(B12$B9TL\!$(B19$B9TL\$N(B exit $B$N@k8@$r4^$`!%(B

8$B9TL\$N(B fopen $B$G$O!$FI9~85$N%U%!%$%k$H$7$F(B "src" $B!$%*!<%W%s;~$N%b!<%I$H$7$F(B "r" $B$r;XDj$7$F$$$k!%(B $B%b!<%I$O!$%*!<%W%s$5$l$?%U%!%$%k$KBP$7$3$N8e5v$5$l$kA`:n!$5Z$S%*!<%W%s;~$N$I$3$+$iFI$_=q$-$,;O$^$k$+$r7hDj$9$k!%(B "r" $B$O!$%U%!%$%k$rFI$_9~$_$N$?$a$K%*!<%W%s$9$k$3$H$r0UL#$7!$%U%!%$%k$N@hF,$+$iFI$_9~$_$,;O$^$k!%(B

14$B9TL\$N(B fopen $B$G$O!$=q$-9~$_@h$N%U%!%$%k$H$7$F(B "dst" $B!$%*!<%W%s;~$N%b!<%I$H$7$F(B "w" $B$r;XDj$7$F$$$k!%(B "w" $B$O!$=q$-9~$_$N$?$a$K%U%!%$%k$r%*!<%W%s$9$k$3$H$r0UL#$7!$%U%!%$%k$,B8:_$7$F$$$J$+$C$?>l9g$O?7$?$K:n$i$l!$B8:_$7$F$$$?>l9g$O%U%!%$%k$ND9$5$O(B 0 $B$K$5$l$k!%(B $B$^$?!$=q$-9~$_$O%U%!%$%k$N@hF,$+$i;O$^$k!%(B

$BB>$K%b!<%I$H$7$F;XDj$G$-$kJ8;zNs$K$O!$(Br+, w+, a, a+ $B!J$D$^$j(B rwa $B$NJ8;z$N$$$:$l$+!$Kt$O$=$l$K(B + $B$rIU$1$?$b$N!K$,$"$k!%(B r+, w+, a+ $B$O$I$l$bFI$_=q$-$N$?$a$K%U%!%$%k$r%*!<%W%s$9$k$3$H$r0UL#$9$k$,!$%U%!%$%k$,B8:_$7$F$$$J$+$C$?>l9g$NF0:n!$$^$?FI$_=q$-$,$I$3$+$i;O$^$k$+!$$H$$$C$?E@$,0[$J$k!%(B $B@53N$J0UL#$O(B FOPEN(3) $B$r;2>H!J(Bman fopen$B!K!%(B

$B$^$?!$%b!<%I$r;XDj$9$kJ8;zNs$K(B b $B$r4^$`%W%m%0%i%`$rL\$K$9$k$3$H$,$"$k$,!$8_49@-$N$?$a$K;D$5$l$F$$$k$@$1$G!$(BPOSIX$B$G$O0UL#$,$J$$!%(B

9$B!A(B12$B9TL\!$(B15$B!A(B19$B9TL\$O(B fopen $B$K<:GT$7$?;~$N=hM}$G$"$k!%(B $B$I$A$i$b4pK\E*$KF1$8$G!$(Bperror $B$K$h$j%(%i!<%a%C%;!<%8$r=PNO$7$?8e$K!$(Bexit $B$K$h$j%W%m%0%i%`$N\:Y$OMh=5$K3+@_$9$kM=Dj!%(B

15$B!A(B19$B9TL\$N=hM}$K$O!$(B"src" $B%U%!%$%k$X$N%U%!%$%k%]%$%s%?$r%/%m!<%:$9$k(B fclose $B$,F~$C$F$$$k!J(B17$B9TL\!K!%(B $B%(%i!<=hM}$G(B exit $B$7$F$7$^$&>l9g$O!$A4$F$N%U%!%$%k$O<+F0E*$K%/%m!<%:$5$l!$NN0h$b3+J|$5$l$F$7$^$&$?$a!$$3$N(B fclose $B$Ol9g$K$O!$F1;~$K%*!<%W%s$G$-$k%U%!%$%k$K$O@)8B$,$"$j!$$^$?%a%b%j%j!<%/$,5/$-$J$$$h$&$K$9$k$?$a$K$b!$4XO"$9$k%U%!%$%k%]%$%s%?$r3N

main$B4X?t$N0z?t(B

$B%U%!%$%k$N%3%T!<$J$I$N%3%^%s%I$N%W%m%0%i%`$r:n$k;~$K$O!$%3%T!<$9$k%U%!%$%kL>$r%3%^%s%I9T$N0z?t$H$7$FEO$;$k$HJXMx$G$"$k!%(B $B$3$N$h$&$J%W%m%0%i%`5/F0;~$N0z?t$O!$(Bmain $B4X?t$X$N0z?t$H$7$FEO$5$l$k!%(B $B0J2<$N%W%m%0%i%`$O!$%3%^%s%I9T$N0z?t$r=PNO$9$k!%(B

     1	#include <stdio.h>
     2
     3	main(int argc, char *argv[])
     4	{
     5		int	i;
     6
     7		for (i = 0; i < argc; i++)
     8			puts(argv[i]);
     9	}

$B$3$l$r%3%s%Q%$%k

% ./a.out src dst [$B
./a.out
src
dst
%

$B>e5-%W%m%0%i%`$N(B3$B9TL\$N(B main $B4X?t$N0z?t$H$7$F(B argc, argv $B$,;XDj$5$l$F$*$j!$(B argc $B$O(B int $B7?!$(Bargv $B$O(B char * $B7?$NG[Ns!J(Bchar $B7?$X$N%]%$%s%?$r3JG<$9$kG[Ns!K$G$"$k!%(B argc $B$O(B argument count$B!$(Bargv $B$O(B argument vector $B$NN,$G$"$k!%(B main $B4X?t$N0z?t$NL>A0$O(B argc, argv $B$G$"$kI,MW@-$O$J$$$,!$47NcE*$K(B argc, argv $B$,;H$o$l$F$-$F$*$j!$$3$NL>A0$G;H$&$3$H$,%W%m%0%i%`$N$o$+$j$d$9$5$NE@$G$bK>$^$7$$!%(B

argc $B$K$O%3%^%s%I9T$NJ8;zNs$N8D?t$,F~$k!J%3%^%s%IL>!\0z?t!K!%(B $B>e5-$N

argv $B$O!$%3%^%s%I9T$NJ8;zNs$=$l$>$l$X$N%]%$%s%?$r3JG<$7$?G[Ns$G$"$k!%(B $B2e5-$N$NJ8;zNs(B "./a.out" $B!$(B argv[1] $B$O:G=i$N0z?t(B "src" $B!$(B argv[2] $B$O

main$B4X?t$N0z?t(B

$B%i%$%V%i%j4X?t$rMQ$$$F%U%!%$%k$N%3%T!<$r9T$&(B$B%W%m%0%i%`(B$B$r!$%3%T!<$9$k%U%!%$%kL>$r%3%^%s%I9T$N0z?t$H$7$FEO$;$k$h$&$K$9$k$H$B%W%m%0%i%`(B$B$K$J$k!%(B

     1	#include <stdio.h>
     2	#include <stdlib.h>
     3
     4	main(int argc, char *argv[])
     5	{
     6		int	c;
     7		FILE	*src, *dst;
     8
     9		if (argc != 3) {
    10			printf("Usage: %s from_file to_file\n", argv[0]);
    11			exit(1);
    12		}
    13
    14		src = fopen(argv[1], "r");
    15		if (src == NULL) {
    16			perror(argv[1]);
    17			exit(1);
    18		}
    19
    20		dst = fopen(argv[2], "w");
    21		if (dst == NULL) {
    22			perror(argv[2]);
    23			fclose(src);
    24			exit(1);
    25		}
    26
    27		while ((c = fgetc(src)) != EOF)
    28			fputc(c, dst);
    29
    30		fclose(src);
    31		fclose(dst);
    32	}

argc, argv $B$r2rl9g$O!$0z?t$N?t$r%A%'%C%/$9$k$3$H$,Bg@Z$G$"$k!%(B $B>e5-$N%W%m%0%i%`$G$O(B 8$B!A(B11$B9TL\$G!$0z?t$N?t$,(B 3 $B$G$J$1$l$P!$$=$N%W%m%0%i%`$N;H$$J}$rI=<($7!$%W%m%0%i%`$r=*N;$9$k$h$&$K$7$F$$$k!%(B

$B$3$l$r%3%s%Q%$%k

% ./a.out [$B
Usage: ./a.out from_file to_file
% ./a.out src_file dst [$B
src_file: No such file or directory
% ./a.out src dst [$B
%

$B%7%9%F%`%3!<%k$rMQ$$$?%U%!%$%k$H$NF~=PNO(B

$B%7%9%F%`%3!<%k$rMQ$$$F%U%!%$%k%"%/%;%9$r9T$&$?$a$K!$%U%!%$%k$r3+$-!$JD$8$k$?$a$K$O(B open, close $B$rMQ$$$k!%(B $BFI$_=q$-$N$?$a$N%7%9%F%`%3!<%k$O(B read, write $B$rMQ$$$k!%(B $B%i%$%V%i%j4X?t$H0[$J$j!$(Bread, write $B0J30$K$OFI$_=q$-$N$?$a$N%7%9%F%`%3!<%k$O$J$$!%(B

int	open(const char *pathname, int flags);
int	open(const char *pathname, int flags, mode_t mode);
int	close(int fd);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

$B%U%!%$%k%"%/%;%9$N$?$a$N%7%9%F%`%3!<%k$O>e5-$N(B open, close, read, write $B$G$"$k!%(B $B%i%$%V%i%j4X?t$b%U%!%$%k%"%/%;%9$r9T$&$?$a$K!$:G=*E*$K$O%7%9%F%`%3!<%k$r;HMQ$9$k!%(B $B=>$C$F!$(Bfopen $B$O(B open $B$r8F$S!$(Bfclose $B$O(B close $B$r8F$V!%(B $BF~NO$N$?$a$N(B getchar, fgetc, fgets, fread $B$O(B read $B$r8F$S!$=PNO$N$?$a$N(B putchar, fputc, fputs, fwrite $B$O(B write $B$r8F$V!%(B

$B%U%!%$%k%G%#%9%/%j%W%?(B

fopen $B$O(B FILE $B9=B$BN$X$N%]%$%s%?$rJV$7!$$=$N8e%*!<%W%s$7$?%U%!%$%k$X$N%"%/%;%9$N$?$a$K$O$=$N%]%$%s%?$rMQ$$$k!%(B open $B$O%*!<%W%s$K@.8y$9$k$H(B 0 $B0J>e$N@0?t$rJV$9!%(B $B$=$N@0?t$O!$%U%!%$%k%G%#%9%/%j%W%?!J%U%!%$%k5-=R;R!K$H8F$P$l$k!%(B $B%7%9%F%`%3!<%k$rMQ$$$F%U%!%$%k%"%/%;%9$r9T$&>l9g$O!$(Bopen $B$K$h$j%U%!%$%k$r%*!<%W%s$7$?8e$O!$La$jCM$N%U%!%$%k%G%#%9%/%j%W%?$r;XDj$9$k$3$H$K$h$j!$$=$N%U%!%$%k$KBP$7FI$_=q$-$r(B read, write $B$rMQ$$$F9T$&$3$H$,$G$-$k!%(B $B%U%!%$%k%"%/%;%9$,=*N;$7$?$i!$%U%!%$%k%G%#%9%/%j%W%?$r0z?t$K(B close $B$r8F$V$3$H$G!$$=$N%U%!%$%k$r%/%m!<%:$G$-$k!%(B

$B$"$k%W%m%;%9$,0l;~$K%*!<%W%s$G$-$k%U%!%$%k$N?t!J%U%!%$%k%G%#%9%/%j%W%?$N:GBgCM!K$O@)8B$5$l$F$$$k!%(B $B@N$N(B UNIX $B$G$OHs>o$K>/$J$+$C$?$,!$8=:_$O$+$J$jB?$/$N%U%!%$%k$r0l;~$K%*!<%W%s$9$k$3$H$,$G$-$k!%(B Mac OS X $B$G$O!$DL>o$N%W%m%;%9$O(B 256 $B$K@_Dj$5$l$F$$$k$,!$(Bunlimit $B$K$h$j:GBg(B 10240 $B$^$G;HMQ2DG=$K$G$-$k!J(B/usr/include/sys/syslimits.h $B$N(B OPEN_MAX$B!K!%(B

$BI8=`F~=PNO$N%U%!%$%k%G%#%9%/%j%W%?(B

$B%i%$%V%i%j4X?t$K$h$kF~=PNO$b7k6I$O%7%9%F%`%3!<%k$r8F$S=P$9$3$H$G

$BI8=`F~=PNO$N$?$a$N%U%!%$%k%G%#%9%/%j%W%?$H$7$F(B 0, 1, 2 $B$,3d$jEv$F$i$l$F$$$k!%(B 0 $B$,I8=`F~NO!$(B1 $B$,I8=`=PNO!$(B2 $B$,I8=`%(%i!<=PNO$KBP1~$9$k!%(B $B$3$l$i(B3$B$D$N%U%!%$%k%G%#%9%/%j%W%?$O!$%W%m%0%i%`$,uBV$K$J$C$F$$$k!%(B

$B%U%!%$%k$N%3%T!<(B

$B%i%$%V%i%j4X?t$rMQ$$$F%U%!%$%k$N%3%T!<$r9T$&(B$B%W%m%0%i%`(B$B$r!$%7%9%F%`%3!<%k$rMQ$$$k$h$&$K=q$-49$($k$H0J2<$N(B$B%W%m%0%i%`(B$B$N$h$&$K$J$k!%(B

     1	#include <stdio.h>
     2	#include <stdlib.h>
     3	#include <fcntl.h>
     4
     5	main()
     6	{
     7		char	c;
     8		int	src, dst;
     9		int	count;
    10
    11		src = open("src", O_RDONLY);
    12		if (src < 0) {
    13			perror("src");
    14			exit(1);
    15		}
    16
    17		dst = open("dst", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    18		if (dst < 0) {
    19			perror("dst");
    20			close(src);
    21			exit(1);
    22		}
    23
    24		while ((count = read(src, &c, 1)) > 0) {
    25			if (write(dst, &c, count) < 0) {
    26				perror("write");
    27				exit(1);
    28			}
    29		}
    30
    31		if (count < 0) {
    32			perror("read");
    33			exit(1);
    34		}
    35
    36		close(src);
    37		close(dst);
    38	}

$B%W%m%0%i%`$NN.$l$O!$%i%$%V%i%j4X?t$rMQ$$$?>l9g$HF1$8$G$"$k!%(B open $B$X$N0z?t$O!$%*!<%W%s$7$?$$%U%!%$%kL>$H!$%U%!%$%k$r%*!<%W%s$9$k%b!<%I$G$"$k!%(B O_RDONLY $B$OFI$_9~$_$N$_!$(BO_WRONLY $B$O=q$-9~$_$N$_$G$"$k!%(B $BFI$_=q$-$N>l9g$O(B O_RDWR $B$r;XDj$9$k!%(B O_RDONLY, O_WRONLY, O_RDWR $B$H0l=o$K@_Dj$G$-$k%b!<%I$,$$$/$D$+$"$k!%(B O_CREAT $B$,%;%C%H$5$l$F$$$k$H!$%U%!%$%k$,B8:_$7$J$+$C$?>l9g$O:n@.$9$k!%(B O_TRUNC $B$,%;%C%H$5$l$F$$$k$H!$%U%!%$%k$,4{$KB8:_$7$?>l9g$O%U%!%$%k$ND9$5$O(B 0 $B$K$5$l$k!%(B $B%b!<%I$K(B O_CREAT $B$,4^$^$l$k>l9g$O!$%U%!%$%k$,:n$i$l$?>l9g$K@_Dj$9$k%Q!<%_%C%7%g%s$,(B3$BHVL\$N0z?t$K$J$k!%(B $B

read $B$OFI$_9~$a$k:GBg%P%$%H?t!$(Bwrite $B$O=q$-9~$a$k:GBg%P%$%H?t$r;XDj$9$k$,!$$=$l$>$l;XDj$5$l$?$@$1$N:GBg%P%$%H?t$rFI$_9~$_Kt$O=q$-9~$_$G$-$k$H$O8B$i$J$$!%(B $B

read, write $B$G;XDj$9$kFI$_=q$-$N:GBg%P%$%H?t$O!$Bg$-$$$[$&$,(B read, write $B%7%9%F%`%3!<%k$N8F$S=P$7$H%3%T!<$N2s?t$,>/$J$/$F$9$`$N$G!$$h$j8zN(E*$G$"$k!%(B $B$D$^$j>e5-$N%W%m%0%i%`$N$h$&$K(B 1 $B$H$9$k$N$O!$Hs>o$K8zN($,0-$$!%(B $BDL>o(B 1024, 4096, 8192 $B$J$I$NCM$,MQ$$$i$l$k$,!$:G$b8zN($NNI$$CM$OF~=PNO@h$N%G%P%$%9!$%G%P%$%9$r@)8f$9$k%3%s%H%m!<%i!$%a%b%j$NNL$J$I$K0MB8$9$k!%(B

$B%i%$%V%i%j$H%7%9%F%`%3!<%k$N:.:_(B

$BF10l$N%U%!%$%k$KBP$9$k%"%/%;%9$r%i%$%V%i%j$H%7%9%F%`%3!<%k$G:.$<$F9T$&$3$H$O!$%W%m%0%i%_%s%0>e$O2DG=$G$O$"$k$,!$7k2L$,$*$+$7$/$J$k2DG=@-$,$"$k$N$G!$Hr$1$k$Y$-$G$"$k!%(B $B%i%$%V%i%j4X?t$G$NF~=PNO$O!$(B1$BJ8;zC10L$NF~=PNO$b8zN($h$/9T$($k$h$&$K!$F~=PNO%G!<%?$r0l;~E*$KC_$($k%P%C%U%!%j%s%0$r$9$k$3$H$G!$%7%9%F%`%3!<%k$N2s?t$r8:$i$7$F$$$k!%(B $B:.$<$F;H$&$H!$%P%C%U%!%j%s%0$5$l$?%G!<%?$H$N@09g@-$,

$B$I$&$7$F$b!$$I$A$i$+$+$i$I$A$i$+$XJQ49$7$?$$;~$K$O!$0J2<$N4X?t$r;HMQ$9$k$3$H$,$G$-$k!%(B fileno, fdopen $B$O!$==J,$J%F%9%H$r$9$k$J$I2?$r$7$F$$$k$N$+M}2r$9$k$h$&Cm0U$7$F;HMQ$9$Y$-$G!$0B0W$K;HMQ$9$Y$-$G$O$J$$!%(B

fflush $B$O!$>e5-$NL\E*$H$O4X78$J$/!$%P%C%U%!%j%s%0$5$l$?%G!<%?$r%U%i%C%7%e$7$?$$;~$K$b;HMQ$G$-$k!%(B

int  fileno(FILE *stream);	      /* FILE$B9=B$BN$N%U%!%$%k%G%#%9%/%j%W%?$rJV$9(B */
FILE *fdopen(int fildes, char *mode); /* $B%U%!%$%k%G%#%9%/%j%W%?$+$i(BFILE$B9=B$BN$r:n$k(B */
int  fflush(FILE *stream);	      /* $B%P%C%U%!%j%s%0$5$l$?%G!<%?$r%U%i%C%7%e(B */

$B%U%!%$%k$N%i%s%@%`%"%/%;%9(B

$BA4$F$r%a%b%j>e$KFI$_9~$`$3$H$,Fq$7$$Bg$-$J%G!<%?$r07$&>l9g!$A4%G!<%?$O%U%!%$%k$K3JG<$7!$I,MW$J%G!<%?$N$_$rFI$_=q$-$9$k$3$H$K$J$k!%(B $B$=$N>l9g!$%G!<%?$r%U%!%$%k$N@hF,$+$i=gHV$KFI$_9~$s$G$$$/%7!<%1%s%7%c%k%"%/%;%9$G$O$J$/!$ESCf$rFI$_Ht$P$9!JFI$_=q$-$9$k>l=j$r0\F0$9$k!K%i%s%@%`%"%/%;%9$,$G$-$k$H8zN($,NI$$!%(B

$B%i%s%@%`%"%/%;%9$r$9$k$?$a$K$O!$%7%9%F%`%3!<%k$N(B read, write $B$rMQ$$$F$$$k>l9g$K$O(B lseek$B!$%i%$%V%i%j4X?t$N(B fread, fwrite $B$rMQ$$$F$$$k>l9g$K$O(B fseek $B$rMQ$$$k!%(B $B$3$l$i$O!$%U%!%$%k$rFI$_=q$-$9$k0LCV!J@hF,$+$i$N%P%$%H?t!K$r0\F0$9$k!%(B $B$3$N0LCV$N$3$H$r!$%*%U%;%C%H!$%7!<%/%]%$%s%?!$%U%!%$%k%]%$%s%?$J$I$H8F$V!J%U%!%$%k%]%$%s%?$H8F$V>l9g$O(B FILE* $B$HJ6$i$o$7$$$N$GCm0U!K!%(B

off_t lseek(int fildes, off_t offset, int whence);
int   fseek(FILE *stream, long offset, int whence);

lseek, fseek $B6&$K;XDj$9$k%Q%i%a!<%?$OF1$8$G!$Bh(B3$B0z?t$N(B whence $B$G;XDj$5$l$k0LCV$KBh(B2$B0z?t$N(B offset $B%P%$%H?t$r2C$($k$3$H$K$h$C$FF@$i$l$?0LCV$K0\F0$9$k!%(B $B$D$^$j!$(Boffset $B$KIi$NCM$r;XDj$9$k$H!$(Bwhence $B$G;XDj$5$l$?0LCV$+$iA0$K0\F0$9$k!%(B whence $B$K$O0J2<$N%^%/%m$N$I$l$+$r;XDj$9$k!%(B

SEEK_SET $B%U%!%$%k$N@hF,$+$i(B offset $B%P%$%HL\$K0\F0!%(B
SEEK_CUR $B8=:_$N0LCV$+$i(B offset $B%P%$%HL\$K0\F0!%(B
SEEK_END $B%U%!%$%k$NKvHx$+$i(B offset $B%P%$%HL\$K0\F0!%(B

SEEK_END $B$K$h$j%U%!%$%kKvHx$+$i@hF,J}8~$K8~$+$C$F(B offset $B%P%$%HL\$K0\F0$7$?$$>l9g!JDL>o$=$&$G$"$k$H;W$o$l$k$,!K$O!$(Boffset $B$K$OIi$NCM$r;XDj$7$J$1$l$P$$$1$J$$$3$H$KCm0U!%(B

$B%U%!%$%k%"%/%;%9!J1~MQ!K(B

$B<+J,$G%P%C%U%!$r3NJ]$7$F$N%U%!%$%k%3%T!<(B

fread, fwrite$B$O%i%$%V%i%j$Gc$7$F$$$k$?$a!$%7%9%F%`%3!<%k$N(B read, write $B$HHf3S$7$F!$;H$$$d$9$$!%(B $B!J%7%9%F%`%3!<%k$N(B read, write $B$O!$c$O$7$F$$$J$$!%!K(B

$B%P%C%U%!%j%s%0$r$7$F$/$l$k(B fread, fwrite $B$rMQ$$$k:]$K$O!$<+J,$G%P%C%U%!$rMQ0U$9$kI,MW$O4pK\E*$K$O$J$$!%(B $B$7$+$7!$$"$kDxEY$NBg$-$5$N%G!<%?$rFI$_9~$`$?$a!$<+J,$GF0E*$KNN0h$r3NJ]$9$kI,MW$,$"$k>l9g$O$"$k!%(B $B$=$N$h$&$J>l9g$rA[Dj$7!$(Bmalloc$B$G%P%C%U%!$r3NJ]$7$F$N%U%!%$%k%3%T!<$NNc$r<($9!%(B

28$B9TL\$G(Bmalloc$B$G%P%C%U%!$r3NJ]$7$F$$$k!%(B $B3NJ]$9$kNN0h$N%5%$%:$r;XDj$7$F$$$k(BBUFSIZ$B$O(B stdio.h $B$GDj5A$5$l$F$$$kI8=`E*$J%P%C%U%!%5%$%:$rI=$9%^%/%m$G$"$k!%(B 36$B9TL\$K$"$k(B feof $B$O!$(Bfread$B$NLa$jCM$+$i$O(BEOF$B$H%(%i!<$N6hJL$,$G$-$J$$$?$a!$(BEOF$B$+$I$&$+$r3NG'$9$k$?$a$K;HMQ$7$F$$$k!%(B 38, 46$B9TL\$K$"$k(B ferror $B$O!$F1MM$NM}M3$G!$%(%i!<=hM}$r9T$&$?$a!$%(%i!<$r6hJL$9$k$?$a$K;HMQ$7$F$$$k!%(B

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4  main(int argc, char *argv[])
     5  {
     6          FILE    *src, *dst;
     7          void    *buf;
     8          int     rcount, wcount;
     9  
    10          if (argc != 3) {
    11                  printf("Usage: %s from_file to_file\n", argv[0]);
    12                  exit(1);
    13          }
    14  
    15          src = fopen(argv[1], "r");
    16          if (src == NULL) {
    17                  perror(argv[1]);
    18                  exit(1);
    19          }
    20  
    21          dst = fopen(argv[2], "w");
    22          if (dst == NULL) {
    23                  perror(argv[2]);
    24                  fclose(src);
    25                  exit(1);
    26          }
    27  
    28          buf = malloc(BUFSIZ);
    29          if (buf == NULL) {
    30                  perror("malloc");
    31                  fclose(src);
    32                  fclose(dst);
    33                  exit(1);
    34          }
    35  
    36          while (!feof(src)) {
    37                  rcount = fread(buf, 1, BUFSIZ, src);
    38                  if (ferror(src)) {
    39                          perror("fwrite");
    40                          fclose(src);
    41                          fclose(dst);
    42                          exit(1);
    43                  }
    44  
    45                  wcount = fwrite(buf, 1, rcount, dst);
    46                  if (ferror(dst)) {
    47                          perror("fwrite");
    48                          fprintf(stderr, "tried to write %d bytes, "
    49                              "but only %d bytes were written.\n", rcount, wcount);
    50                          fclose(src);
    51                          fclose(dst);
    52                          exit(1);
    53                  }
    54          }
    55  
    56          fclose(src);
    57          fclose(dst);
    58	}

$B9=B$BN$NF~=PNO(B

$B$^$H$a$F07$&$HJXMx$J%G!<%?$O!$(BC$B%W%m%0%i%`$G$O9=B$BN$rMQ$$$FI=8=$9$k!%(B $BNc$($P=;=jO?$r:n$k>l9g!$L>A0!$=;=j!$EEOCHV9f!$%a%$%k%"%I%l%9$J$I$r9=B$BN$H$7$F$^$H$a$F07$&$H!$%=!<%H$d8!:w$J$IMM!9$J=hM}$,$7$d$9$/$J$k!%(B

sizeof

$B$=$N$h$&$J9=B$BN$N%G!<%?$r%U%!%$%k$KJ]B8!$$^$?$OFI$_=P$9$?$a$K!$$^$:CN$i$J$/$F$O$J$i$J$$$3$H$O!$9=B$BN$NBg$-$5$G$"$k!%(B $B=;=jO?$N$=$l$>$l$N%(%s%H%j$N$?$a$K!$0J2<$N$h$&$J9=B$BN$rDj5A$7$?$H$9$k!%(B

     1  struct entry {
     2          char    name_family[32];
     3          char    name_first[32];
     4          char    addr[128];
     5          int     zip1;
     6          int     zip2;
     7          char    mail[128];
     8  };

$B$3$N9=B$BN$NBg$-$5$rCN$k$?$a$K$O(B sizeof $B1i;;;R$rMQ$$$k!%(B struct entry $B$NDj5A$O(B addr.h $B$K=q$+$l$F$$$k$H$9$k$H!$0J2<$N%W%m%0%i%`$O$=$N%P%$%H?t$rI=<($9$k!%(B

     1  #include <stdio.h>
     2  #include "addr.h"
     3
     4  main()
     5  {
     6          printf("sizeof(struct addr) = %d\n", sizeof(struct entry));
     7  }

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

% ./a.out [$B
sizeof(struct addr) = 328
%

struct entry $B$O!$L>A0$K(B32$B%P%$%HG[Ns$,(B2$B$D!$=;=j$H%a%$%k$K(B128$B%P%$%H$NG[Ns$,(B2$B$D!$M9JXHV9f$K(B4$B%P%$%H$N(B int $B$,(B2$B$D;HMQ$7$F$$$k$?$a!$9g7W(B328$B$H$J$j!$>e5-$N

$B9=B$BN$NBg$-$5$O!$I,$:$7$b%a%s%P$NBg$-$5$NC1=c$JOB$K$O$J$k$H$O8B$i$J$$$3$H$KCm0U(B $B"*(B$B%G!<%?%U%!%$%k$N%]!<%?%S%j%F%#(B

utmp$B%G!<%?$NFI$_9~$_(B

/var/run/utmp $B$H$$$&%U%!%$%k$K$O8=:_%m%0%$%s$7$F$$$k%f!<%6$,5-O?$5$l$F$$$k!%(B $B0J2<$N(B$B%W%m%0%i%`(B$B$O(B fread $B$rMxMQ$7(B1$B%(%s%H%j$4$H%G!<%?$rFI$_9~$_!$%m%0%$%s%f!<%6$rI=<($9$k%W%m%0%i%`$G$"$k!%(B

struct utmp $B$NDj5A$O(B /usr/include/utmp.h $B$+$iFI$_9~$^$l$k!%(B 10$B9TL\$N(B _PATH_UTMP $B$O(B /var/run/utmp $B$rI=$9!%(B $B%^%/%m$K$J$C$F$$$k$N$O(BUNIX$B$N%P!<%8%g%s$K$h$j%Q%9$,0[$J$C$F$$$k$3$H$,$"$k$?$a$G$"$j!$%^%/%m$K$9$k$3$H$K$h$j%W%m%0%i%`$N0\?"@-$r9b$a$k$3$H$,$G$-$k!%(B $B!J$7$+$7$J$,$i(BUNIX$B$N7OE}$K$h$C$F$O0[$J$k%^%/%m$,;H$o$l$F$$$k!%(B Linux$B$G$O(B _PATH_UTMP $B$G$O$J$/(B UTMP_FILE $B$H$J$C$F$$$k!%!K(B

18$B9TL\$GFI$_9~$s$@%(%s%H%j$r(B19$B!A(B20$B9TL\$G=PNO$7$F$$$k!%(B printf $B$N=PNO%U%)!<%^%C%H$G(B %8.8s $B$N%T%j%*%I!J(B.$B!K$NA0$N(B8$B$O(B8$B7e$N%U%#!<%k%II}$r3NJ]$9$k$3$H$r0UL#$7!$$^$?%T%j%*%I$N8e$m$N(B8$B$O=PNO$9$k:GBgJ8;z?t$rI=$9!%(B $BB($A!$(B%8.8s $B$O>o$K(B8$BJ8;zJ,$N%U%#!<%k%I$K$O$_=P$5$J$$$h$&$K=PNO$5$l$k$3$H$r0UL#$9$k!%(B

$BCm(B$B!'2<5-$N%W%m%0%i%`$O(B Linux $B$G$OF0:n$9$k$,!$(BMac OS X $B$G$O(B utmp $B%U%!%$%k$,$J$/$J$j

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <time.h>
     4  #include <utmp.h>
     5
     6  main()
     7  {
     8          FILE    *fp ;
     9          struct utmp     u;
    10
    11          fp = fopen(_PATH_UTMP, "r");
    12
    13          if (fp == NULL) {
    14                  perror(_PATH_UTMP);
    15                  exit(-1);
    16          }
    17
    18          while (fread(&u, sizeof(u), 1, fp) == 1) {
    19                  printf("%8.8s|%16.16s|%8.8s|%s", u.ut_name,
    20                      u.ut_host, u.ut_line, ctime(&u.ut_time));
    21          }
    22
    23          fclose(fp);
    24  }

$B>e5-%W%m%0%i%`$r%3%s%Q%$%k

% ./a.out [$B
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
        |                |        |Thu Jan  1 09:00:00 1970
    shui|alias.cs.tsukuba|   ttyp0|Wed Apr  5 09:28:07 2006
    shui|alias.cs.tsukuba|   ttyp1|Wed Apr  5 09:28:17 2006
% who [$B
shui     ttyp0    Apr  5 09:28 (alias.cs.tsukuba)
shui     ttyp1    Apr  5 09:28 (alias.cs.tsukuba)
%

$B>e5-$N%W%m%0%i%`$O(B Mac OS X $B$G$O(B utmp $B%U%!%$%k$,$J$/$J$je=q$-$5$l$F$7$^$&$3$H$KCm0U$9$k!%(B $B0J2<$O(B getutxent $B$rMQ$$$?%W%m%0%i%`$G$"$k!%(B

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <time.h>
     4  #include <utmpx.h>
     5  
     6  main()
     7  {
     8          struct utmpx    *up;
     9  
    10          while ((up = getutxent()) != NULL) {
    11                  printf("%8.8s|%16.16s|%8.8s|%s", up->ut_user,
    12                      up->ut_host, up->ut_line, ctime(&up->ut_tv.tv_sec));
    13		}
    14	}

$B%G!<%?%U%!%$%k$N%]!<%?%S%j%F%#(B

$B9=B$BN$N%G!<%?$r=q$-9~$_:n@.$7$?%G!<%?$rMM!9$J%3%s%T%e!<%?$G6&M-$7$h$&$H$9$k;~$KCm0U$7$J$1$l$P$$$1$J$$$N$O!$%G!<%?$,$I$N$h$&$K%U%!%$%k$K=q$+$l$F$$$k$N$+$H$$$&E@$G$"$k!%(B $BB($A!$?tCM%G!<%?$,$I$N$h$&$K%a%b%j>e$GI=8=$5$l$F$$$k$N$+$K$D$$$FCN$kI,MW$,$"$k!%(B $BNc$($P!$0J2<$N$h$&$JE@$K$D$$$F5$$r$D$1$kI,MW$,$"$k!%(B

  • $B%P%$%H?t!'(B 32$B%S%C%H%W%m%;%C%5$G$O(B int $B$O(B4$B%P%$%H$G$"$k$,!$(B16$B%S%C%H%W%m%;%C%5$G$O(B 2 $B%P%$%H$N$3$H$bB?$$!%(B
  • $B%P%$%H%*!<%@!'(B int $B$N?tCM$,(B4$B%P%$%H$GI=$5$l$k$H$7$F!$(B100$BHVCO$K=q$-9~$`$H!$3F%P%$%H$O(B100$B!A(B103$B$NHVCO$K=q$-9~$^$l$k(B $B?tCM$NCf$N0lHV>.$5$$J}$r(B100$BHVCO!$0lHVBg$-$$J}$r(B103$BHVCO$K=q$-9~$`%W%m%;%C%5!J%j%H%k%(%s%G%#%"%s!K$H!$(B $B5U$K0lHVBg$-$$J}$r(B100$BHVCO!$0lHV>.$5$$J}$r(B103$BHVCO$K=q$-9~$`%W%m%;%C%5!J%S%C%0%(%s%G%#%"%s!K$,$"$k!%(B
  • $B%"%i%$%s%a%s%H!'(B $B%W%m%;%C%5$K$H$C$FD>@\$N7W;;BP>]$G$"$k?tCM$r%a%b%j>e$K3JG<$9$k;~!$$=$N%W%m%;%C%5$K$H$C$F:G$bET9g$,NI$$$h$&$KG[CV$7$F$7$^$&!%(B $B:G6a$NB?$/$N%W%m%;%C%5$G$O(B int $B$d(B double $B$H$$$C$?(B4$B%P%$%H$N%G!<%?$O(B4$B%P%$%H6-3&!J(B4$B$G3d$j@Z$l$kHVCO!K$K9g$o$;$FG[CV$9$k!%(B $B$3$N$h$&$JG[CV$N$3$H$r%"%i%$%s%a%s%H$H8F$V!%(B

$B$"$k0UL#!$:G$b%]!<%?%S%j%F%#$,9b$$$N$O(B1$B%P%$%H$4$H$K%"%/%;%9$G$-$k%F%-%9%H%U%!%$%k$G$"$k!%(B $BNc$($P!$MM!9$J%G!<%?$r07$($k$h$&$K@_7W$5$l$?(BXML$B$O%F%-%9%H7A<0$G$"$k!%(B

$B9=B$BN$NF~=PNO$HF0E*%a%b%j3NJ](B

utmp$B%U%!%$%k$N3F%(%s%H%j$NFbMF$rJ];}$9$k%j%9%H$r:n$k$3$H$r9M$($k!%(B $BFI$_9~$`%l%3!<%I$,8GDjD9$J$i$P!$%U%!%$%k$N%5%$%:$+$iI,MW$JNN0h$N%5%$%:$r7W;;$9$k$3$H$b$G$-$k$,!$$3$3$G$O%(%s%H%jFI$_9~$`EY$KI,MW$JNN0h$rF0E*$K3NJ]$7$F$_$k!%(B

7~10$B9TL\$G%j%9%H$r:n$k9=B$BN$rDj5A$7$F$$$k!%(B $B%a%s%P(Bnext$B$,

$BCm(B$B!'2<5-$N%W%m%0%i%`$O(B Linux $B$G$OF0:n$9$k$,!$(BMac OS X $B$G$O(B utmp $B%U%!%$%k$,$J$/$J$j

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <strings.h>
     4  #include <time.h>
     5  #include <utmp.h>
     6  
     7  struct utmplist {
     8          struct utmplist *next;
     9          struct utmp     u;
    10  };
    11  
    12  main()
    13  {
    14          FILE    *fp ;
    15          struct utmplist *ulhead = NULL;
    16          struct utmplist *ulprev, *ulp;
    17  
    18          fp = fopen(_PATH_UTMP, "r");
    19          if (fp == NULL) {
    20                  perror(_PATH_UTMP);
    21                  exit(-1);
    22          }
    23  
    24          for (;;) {
    25                  ulp = calloc(1, sizeof(struct utmplist));
    26                  if (ulp == NULL) {
    27                          perror("calloc");
    28                          fclose(fp);
    29                          exit(-1);
    30                  }
    31  
    32                  if (fread(&ulp->u, sizeof(ulp->u), 1, fp) != 1) {
    33                          free(ulp);
    34                          break;
    35                  }
    36  
    37                  if (ulhead == NULL)
    38                          ulhead = ulp;
    39                  else 
    40                          ulprev->next = ulp;
    41  
    42                  ulprev = ulp;
    43          }
    44  
    45          fclose(fp);
    46          ulp = ulhead;
    47  
    48          while (ulp) {
    49                  printf("%8.8s|%16.16s|%8.8s|%s", ulp->u.ut_name,
    50                      ulp->u.ut_host, ulp->u.ut_line, ctime(&ulp->u.ut_time));
    51                  ulprev = ulp;
    52                  ulp = ulp->next;
    53			free(ulprev);
    54		}
    55	}
$B>e5-$N(B utmp $B%U%!%$%k$rFI$_9~$`%W%m%0%i%`$O(B main $B4X?t$,D9$/$J$j!$$d$dFI$_$K$/$$!%(B $B$=$3$G!"FI$_9~$_It$H=q$-=P$7It$r4X?t$KJ,$19=B$2=$7$?(B$B%W%m%0%i%`(B$B$r0J2<$K<($9!%(B $B4X?tC10L$GFbMF$rGD0.$9$k$3$H$,$G$-!$$o$+$j$d$9$/$J$k!%(B
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <strings.h>
     4  #include <time.h>
     5  #include <utmp.h>
     6  
     7  struct utmplist {
     8          struct utmplist *next;
     9          struct utmp     u;
    10  };
    11  
    12  struct utmplist *
    13  read_utmp(FILE *fp, struct utmplist *head)
    14  {
    15          struct utmplist *ulprev, *ulp;
    16  
    17          for (;;) {
    18                  ulp = calloc(1, sizeof(struct utmplist));
    19                  if (ulp == NULL) {
    20                          perror("calloc");
    21                          fclose(fp);
    22                          exit(-1);
    23                  }
    24  
    25                  if (fread(&ulp->u, sizeof(ulp->u), 1, fp) != 1) {
    26                          free(ulp);
    27                          break;
    28                  }
    29  
    30                  if (head == NULL)
    31                          head = ulp;
    32                  else 
    33                          ulprev->next = ulp;
    34  
    35                  ulprev = ulp;
    36          }
    37  
    38          return head;
    39  }
    40  
    41  void
    42  write_utmp(FILE *fp, struct utmplist *head)
    43  {
    44          struct utmplist *ulprev;
    45          struct utmplist *ulp = head;
    46  
    47          while (ulp) {
    48                  fprintf(fp, "%8.8s|%16.16s|%8.8s|%s", ulp->u.ut_name,
    49                      ulp->u.ut_host, ulp->u.ut_line, ctime(&ulp->u.ut_time));
    50                  ulprev = ulp;
    51                  ulp = ulp->next;
    52                  free(ulprev);
    53          }
    54  }
    55  
    56  main()
    57  {
    58          FILE    *fp ;
    59          struct utmplist *ulhead = NULL;
    60  
    61          fp = fopen(_PATH_UTMP, "r");
    62          if (fp == NULL) {
    63                  perror(_PATH_UTMP);
    64                  exit(-1);
    65          }
    66  
    67          ulhead = read_utmp(fp, ulhead);
    68  
    69          fclose(fp);
    70  
    71          write_utmp(stdout, ulhead);
    72	}

$B%]%$%s%?!J#3!K(B

$B%P%C%U%!$X$N%]%$%s%?(B

$B0J2<$O!$(B$B<+J,$G%P%C%U%!$r3NJ]$7$F$N%U%!%$%k%3%T!<(B$B$N(B28~34$B9TL\$r(B #if 0 ~ #endif $B$G0O$_!$%3%s%Q%$%k;~$KL5;k!J@53N$K$O(B cpp $B%W%j%W%m%;%C%5$K$h$j:o=|!K$5$l$k$h$&$K$9$k$3$H$G!$(Bmalloc$B$K$h$kF0E*%a%b%j3NJ]$,9T$o$l$J$$$h$&$K$7$?%W%m%0%i%`$G$"$k!%(B 7$B9TL\$G(B void * $B7?$NJQ?t(B buf $B$,@k8@$5$l$F$$$k$,!$=i4|2=$5$l$:!$$=$NCM$OITDj$N$^$^!$(B39, 47$B9TL\$GFI$_=q$-$N%P%C%U%!$K;XDj$5$l$F$$$k!%(B buf $B$OM-8z$J%a%b%jNN0h$r;X$7$F$$$J$$$?$a!$

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4  main(int argc, char *argv[])
     5  {
     6          FILE    *src, *dst;
     7          void    *buf;
     8          int     rcount, wcount;
     9  
    10          if (argc != 3) {
    11                  printf("Usage: %s from_file to_file\n", argv[0]);
    12                  exit(1);
    13          }
    14  
    15          src = fopen(argv[1], "r");
    16          if (src == NULL) {
    17                  perror(argv[1]);
    18                  exit(1);
    19          }
    20  
    21          dst = fopen(argv[2], "w");
    22          if (dst == NULL) {
    23                  perror(argv[2]);
    24                  fclose(src);
    25                  exit(1);
    26          }
    27  
    28  #if 0
    29          buf = malloc(BUFSIZ);
    30          if (buf == NULL) {
    31                  perror("malloc");
    32                  fclose(src);
    33                  fclose(dst);
    34                  exit(1);
    35          }
    36  #endif
    37  
    38          while (!feof(src)) {
    39                  rcount = fread(buf, 1, BUFSIZ, src);
    40                  if (ferror(src)) {
    41                          perror("fwrite");
    42                          fclose(src);
    43                          fclose(dst);
    44                          exit(1);
    45                  }
    46  
    47                  wcount = fwrite(buf, 1, rcount, dst);
    48                  if (ferror(dst)) {
    49                          perror("fwrite");
    50                          fprintf(stderr, "tried to write %d bytes, "
    51                              "but only %d bytes were written.\n", rcount, wcount);
    52                          fclose(src);
    53                          fclose(dst);
    54                          exit(1);
    55                  }
    56          }
    57  
    58          fclose(src);
    59          fclose(dst);
    60	}

$B$7$+$7$J$,$i!$$3$N%W%m%0%i%`$O%3%s%Q%$%k$G$-$F$7$^$&!%(B $B$7$+$b!$C1=c$K(B cc $B%3%^%s%I$r%*%W%7%g%sL5$7$G;HMQ$7$F%3%s%Q%$%k$9$k$H!$2?$N7Y9p$b=PNO$5$l$J$$$3$H$,B?$$!%(B

$B0J2<$N$h$&$K(B cc $B$K(B -O -Wall $B$H$$$&(B2$B$D$N%*%W%7%g%s$rIU$1$F%3%s%Q%$%k$9$k$H!$(Bbuf $B$,=i4|2=$5$l$:$K;HMQ$5$l$F$$$k$H$$$&7Y9p$,=PNO$5$l$k!%(B $B!J(B-O $B$@$1!$$^$?$O(B -Wall $B$@$1$G$O7Y9p$O=PNO$5$l$J$$!%N>J}$N%*%W%7%g%s$r;XDj$9$kI,MW$,$"$k!%!K(B $B$=$NB>!$$$$m$$$m$J7Y9p$r=PNO$7$F$/$l$k$?$a!$I,MW$K1~$8$F!$$3$N$h$&$J%*%W%7%g%s$r;XDj$9$k$HNI$$!%(B

% cc -Wall -O bad-filecopy.c [$B
bad-filecopy.c:5: warning: return type defaults to $B!F(Bint$B!G(B
bad-filecopy.c: In function $B!F(Bmain$B!G(B:
bad-filecopy.c:39: warning: $B!F(Bbuf$B!G(B is used uninitialized in this function
bad-filecopy.c:60: warning: control reaches end of non-void function

$B%G!<%?NN0h$N

$BJQ?t$K$O!$4pK\E*$K$O!$%0%m!<%P%kJQ?t$H%m!<%+%kJQ?t$,$"$k$,!$JQ?tL>$NM-8zHO0O!J%9%3!<%W!K$@$1$G$J$/!$$=$NNN0h$,M-8z$J4|4V$K$D$$$F$bM}2r$7!$%W%m%0%i%_%s%0;~$K$O0U<1$7$J$1$l$P$J$i$J$$!%(B $B%R!<%WNN0h$b2C$(!$$=$l$>$l$NM-8z4|4V$K$D$$$F0J2<$K$^$H$a$k!%(B

$B%0%m!<%P%kJQ?t$,;HMQ$9$kNN0h$O!$%W%m%0%i%`uBV$,JQ2=$9$k$3$H$,$J$$$?$a!$@EE*$JNN0h3NJ]$H$$$&8@$$J}$b$9$k!%(B $B=i4|CM$r;}$D$b$N!$;}$?$J$$!J=i4|CM$,(B0$B!K$b$N$K6hJL$5$l!$$=$l$>$l%G!<%?%;%0%a%s%H!J%;%/%7%g%s!K!$(BBSS$B%;%0%a%s%H$KCV$+$l$k!%(B $B%W%m%0%i%`l9g$O!$%W%m%0%i%`$N

$B%m!<%+%kJQ?t$,;HMQ$9$kNN0h$O!$@k8@$5$l$?4X?t$,8F$S=P$5$l$F$+$i8F$S=P$785$KLa$k$^$GM-8z$G$"$k!%(B $B$=$N4X?t$,JL$N4X?t$r8F$S=P$7$?>l9g$b!JKvHx8F$S=P$7$N>l9g$r=|$-!K$=$N4X?t$,(B return $B$9$k$^$G!$%m!<%+%kJQ?t$OM-8z$G$"$k!%(B $B$D$^$j!$4X?t(B func1 $B$G@k8@$5$l$?%m!<%+%kJQ?t(B var1 $B$O!$(Bfunc1 $B$+$i8F$S=P$5$l$k(B func2 $B$r$C$F!$(Bfunc2 $B$K0z?t$H$7$F(B var1 $B$X$N%]%$%s%?!J(B&var1$B!K$rEO$7$F$b!$(Bvar1 $B$NNN0h$,M-8z$G$"$k$?$a!$(Bfunc2 $B$G$=$NNN0h$r;HMQ$9$k$3$H$,$G$-$k!%(B $B5U$K!$(Bfunc1 $B$NLa$jCM$H$7$F(B &var $B$rJV$9$3$H$O!$(Bfunc1 $B$N(B return $B8e$K$=$NNN0h$OL58z$K$J$k$?$a!$$G$-$J$$!%(B
$B%m!<%+%kJQ?t$,;HMQ$9$kNN0h$O!$%9%?%C%/>e$K3NJ]$5$l$k!%(B $B%9%?%C%/$O4X?t8F$S=P$7$N:]$K?-$S!$La$k:]$K=L$`!%(B $B=>$C$F!$$=$NNN0h$O:FMxMQ$r7+$jJV$7$F$$$k$3$H$K$J$k!%(B $B$=$N%9%?%C%/$N$?$a$NNN0h$NBg$-$5$O!$%7%9%F%`$K$h$C$F0[$J$k!%(B $BI,MW$J$@$1?-$S$F$$$/%7%9%F%`$bB?$$$,!$%5%$%:$,8GDj$5$l$F$$$k%7%9%F%`$b$"$k!%(B $B$=$N$?$a!$Bg$-$J%G!<%?$r%9%?%C%/>e$K3NJ]$9$k$h$&$J%W%m%0%i%`$O!$%7%9%F%`$K$h$jF0:n$7$?$j$7$J$+$C$?$j!$$H$$$&$3$H$,5/$3$k2DG=@-$,$"$k!%(B

$B%R!<%WNN0h$O%W%m%0%i%`uBV$,JQ2=$9$k$?$a!$F0E*$JNN0h3NJ]$H$$$&8@$$J}$r$9$k!%(B $B3NJ]!$2rJ|$O!$L@<(E*$K9T$o$l$k!%(B $B

$B%]%$%s%?$rMQ$$$k>l9g!$$=$N;X$7<($9@h$,$I$NNN0h$G$"$k$+!$>o$K0U<1$7!$M-8z$JNN0h$r@5$7$/;HMQ$7$J$1$l$P$J$i$J$$!%(B

$B%P%C%U%!%*!<%P!<%U%m!<(B

$B%P%C%U%!%*!<%P!<%U%m!<$O%W%m%0%i%`$Nh$Ch$C

$B%P%C%U%!%*!<%P!<%U%m!<$,$I$&$7$F5/$3$k$N$+M}2r$9$k$?$a$K$O!$%W%m%;%9$,

$B2o!$:G$b2<0L%"%I%l%9$K5!3#8lL?Na$,F~$C$?%F%-%9%HNN0h$,CV$+$l$k!%(B $B$=$N>e$K%G!<%?NN0h$,CV$+$l$k!%(B $B%G!<%?NN0h$H$OJL$K!$4X?t8F$S=P$7;~$NLa$j%"%I%l%9!J%j%?!<%s%"%I%l%9!K$d4X?t$N%m!<%+%kJQ?t$,3JG<$5$l$k%9%?%C%/NN0h$,$"$k!%(B $B%G!<%?NN0h$O%G!<%?3d$jEv$F$,5/$3$k$?$S$K>e0L%"%I%l%9$K8~$+$C$F?-$S$F$$$/!%(B $B%9%?%C%/NN0h$O5U$K!$4X?t8F$S=P$7$,5/$3$k$?$S$K2<0L%"%I%l%9$K8~$+$C$F?-$S$F$$$/!%(B

$B%W%m%;%9$N%

$B%9%?%C%/NN0h$r$h$j>\:Y$K?^<($9$k$H2

$B%P%C%U%!%*!<%P!<%U%m!<(B

$B%9%?%C%/%U%l!<%`Cf$N%m!<%+%kJQ?t$KG[Ns$,4^$^$l$F$$$k$H!$G[Ns$NE:;z$,>.$5$$$[$&$,2<0L%"%I%l%9$K$"$j!$Bg$-$$$[$&$,>e0L%"%I%l%9$K$/$k!%(B $B>e$N?^$G(B buf $B$,%]%$%s%?$H$7$FNc$($P(B gets $B$KEO$5$l$k$H!$(Bbuf[0] $B$+$i>e0L%"%I%l%9$K8~$+$C$F=q$-9~$^$l$F$$$/!%(B 64$BJ8;z0J>e$NJ8;z$,=q$-9~$^$l$k$H!$(Bbuf[63] $B$rD6$($F=q$-9~$^$l!$(Bbuf $B$H$7$F3d$jEv$F$i$l$?NN0h$rD6$($F=q$-9~$^$l$F$7$^$&$3$H$K$J$k!%(B $B$5$i$K=q$-9~$^$l$k$H!$%j%?!<%s%"%I%l%9$b=q$-49$($i$l$F$7$^$&!%(B $B%9%?%C%/NN0h$K$&$^$/%W%m%0%i%`$r=q$-9~$_!$%j%?!<%s%"%I%l%9$r$=$N%W%m%0%i%`$N3+;O%"%I%l%9$K@_Dj$7$F$"$2$k$H!$4X?t$,La$k;~$K=q$-9~$s$@%W%m%0%i%`$,

$B$3$N$h$&$J967bJ}K!$r%9%?%C%/%9%^%C%7%s%0(B (stack smashing) $B$H8F$V!%(B

$B0J2<$O%9%?%C%/$rGK2u$7$F$7$^$&%W%m%0%i%`$NNc$G$"$k!%(B

     1	#include <stdio.h>
     2	#include <string.h>
     3
     4	char	*longstr = "01234567890abcdefghijklmnopqrstuvwxyz"
     5			   "01234567890abcdefghijklmnopqrstuvwxyz"
     6			   "01234567890abcdefghijklmnopqrstuvwxyz"
     7			   "01234567890abcdefghijklmnopqrstuvwxyz"
     8			   "01234567890abcdefghijklmnopqrstuvwxyz"
     9			   "01234567890abcdefghijklmnopqrstuvwxyz";
    10
    11	void
    12	with_check(char *src)
    13	{
    14		char	buf[20];
    15		int	i;
    16
    17		i = strlcpy(buf, src, sizeof(buf));
    18
    19		if (i > sizeof(buf) - 1)
    20			printf("with_check: buf is too short to copy src(%s).\n",
    21			    src);
    22
    23		printf("with_check: buf(%s)\n", buf);
    24	}
    25
    26	void
    27	without_check(char *src)
    28	{
    29		char	buf[20];
    30		strcpy(buf, src);
    31		printf("without_check: buf(%s)\n", buf);
    32	}
    33
    34	main()
    35	{
    36		with_check(longstr);
    37		without_check(longstr);
    38	}

$B$3$l$r%3%s%Q%$%ko=*N;$7$F$7$^$&!%(B

% ./a.out [$B
with_check: buf is too short to copy src(01234567890...$B0J2

$B%W%m%;%9$N35G0$H5!G=(B

$B%W%m%0%i%`$H%W%m%;%9(B

$B%W%m%0%i%`$O!$(BCPU$B$,$K!$%X%C%@$H8F$P$l$kItJ,$K$O5!3#8lL?Na$d%G!<%?$J$I$N3FNN0h$N>pJs$,4^$^$l!$$^$?6&M-%i%$%V%i%j$rMQ$$$k$h$&$KF0E*%j%s%/$5$l$?l9g$OpJs!$%=!<%9%3!<%I%l%Y%k$N%G%P%C%0>pJsIU$-$G%3%s%Q%$%k!J(Bcc -g$B!K$5$l$?l9g$O%G%P%C%0>pJs$J$I$b4^$^$l$k!%(B

$B0lJ}!$%W%m%0%i%`$rpJs$K2C$($F!$%W%m%0%i%`$K$O4^$^$l$J$$pJs$,F~$C$F$$$k!%(B $B=i4|CM$,(B 0 $B!J=i4|CM$J$7!K$N%G!<%?NN0h$O%W%m%0%i%`$K4^$a$kI,MW@-$O$J$/!$$=$N%G!<%?NN0h$,%W%m%;%9Cf$N$I$3$K$I$l$@$1$NBg$-$5I,MW$+$H$$$&>pJs$@$1$,4^$^$l$F$$$l$P$h$$!%(B $B$7$+$7!$%W%m%0%i%`$NpJs$d%G%P%C%0>pJs$OI,MW$,$"$l$P%W%m%0%i%`%U%!%$%k$+$iFI$_9~$a$P$h$/!$%W%m%;%9$G$NoJQ$o$i$J$$!K!%(B $B%W%m%0%i%`$K$O4^$^$l$F$$$J$$!$

$B%W%m%0%i%`$H%W%m%;%9$N4X78(B

$B%W%m%;%9$N5!G=(B

$B%W%m%;%9$N=EMW$J5!G=$H$7$F0J2<$N#2$D$,$"$k!%(B

  • $B;q8;3d$jEv$F(B
  • $BJ]8n(B

$B;q8;3d$jEv$F(B

UNIX$B$K$*$1$k%W%m%;%9$O!$%W%m%;%C%5;~4V!$%a%b%j!$%U%!%$%k!$%-!<%\!<%I$d%G%#%9%W%l%$!$%W%j%s%?$J$I$N%G%P%$%9$H$$$C$?!$=hM}$r9T$&$K$"$?$C$FI,MW$H$J$k7W;;;q8;$N3d$jEv$FC10L$G$"$k!%(B $B%f!<%6$,%W%m%0%i%`$r5/F0$9$k$H!$$=$l$O%W%m%;%9$K$h$j

$B4pK\E*$K$O!$(BOS$B%+!<%M%k$O!$%W%m%;%C%5;~4V$d%a%b%j$K4X$7$F$O!$$=$l$>$l$N%W%m%;%9$KJ?Ey$K$J$k$h$&$K3d$jEv$F$k!%(B $B%U%!%$%k$d%G%P%$%9$K4X$7$F$O@hCe=g$G$"$k!%(B

$BJ]8n(B

$B%W%m%;%9$O!$3d$jEv$F$i$l$?;q8;$,J]8n$5$l$kC10L$G$b$"$k!%(B $B$"$k%W%m%;%9$OB>$N%W%m%;%9$K3d$jEv$F$i$l$?;q8;$KBP$75v2D$J$/%"%/%;%9$9$k$3$H$O$G$-$J$$!%(B $BNc$(F1$8%f!<%6$K$h$j:n@.$5$l$?%W%m%;%94V$G$"$C$F$b$G$"$k!%(B $BJ]8n$N5!G=$K$h$j!$Nc$($P$"$kK=Av$7$?%W%m%;%9$,B>$N%W%m%;%9$N

$B%W%m%;%9$N%a%b%j%^%C%W(B

$B%W%m%;%9$N%a%b%j%^%C%W$r>\$7$/8+$k$H0J2<$N$h$&$K$J$k!%(B

$B%a%b%j%^%C%W(B

$B$=$l$>$l$NNN0h$NMQES$O0J2<$NDL$j$G$"$k!'(B
$B%F%-%9%HNN0h(B $B%W%m%0%i%`$N5!3#8lL?Na$,CV$+$l$k!%$3$NNN0h$OFI$_=P$7@lMQ$K$J$C$F$*$j!$F1$8%W%m%0%i%`$+$i5/F0$5$l$k%W%m%;%9$N4V$G6&M-2DG=$K$J$C$F$$$k!%(B
$B%G!<%?NN0h!J=i4|CM$"$j!K(B $B%W%m%0%i%`Cf$K;XDj$5$l$?(B 0 $B0J30$N=i4|CM$r;}$DBg0h(B (global) $BJQ?t!$@EE*6I=j(B (static local) $BJQ?t$,CV$+$l$k!%(B
$B%G!<%?NN0h!J=i4|CM$J$7!K(B $BDL>N(B BSS (Block Started by Symbol) $B%;%0%a%s%H!%=i4|CM$r;}$?$J$$!$Kt$O=i4|CM$,(B 0 $B$NBg0hJQ?t!$@EE*6I=jJQ?t$,CV$+$l$k!%%W%m%;%9:n@.;~$K3NJ]$5$l!$(B0 $B$K=i4|2=$5$l$k!%(B $BJQ?t$NL>A0!J%7%s%\%k!K$@$1$J$N$,L>A0$NM3Mh!%(B
$B%R!<%WNN0h(B malloc()$B$J$I$K$h$j!$%W%m%;%9
$B6&M-%i%$%V%i%j(B $B6&M-%i%$%V%i%j$N$?$aNN0h$O%R!<%W$H%9%?%C%/$N4V$K$H$i$l$k!%%F%-%9%HNN0h$HF1$8$/FI$_=P$7@lMQ$G!$B>$N%W%m%0%i%`$H6&M-$5$l$k!%(B
$B%9%?%C%/NN0h(B C$B8@8l$N<+F0JQ?t!J(Bstatic$B$G$J$$%m!<%+%kJQ?t!K$d!$0z?t!$4X?t8F$S=P$7;~$NLa$jHVCO$J$I$,CV$+$l$k!%(B
$B0z?t!$4D6-JQ?t(B $B%3%^%s%I$KEO$5$l$k0z?t!$4D6-JQ?t$O!$%9%?%C%/NN0h$N:G>e0LItJ,$K3JG<$5$l$F$$$k!%(B

$B>e5-$N%a%b%j%^%C%W$O!$0J2<$N4JC1$J(B$B%W%m%0%i%`(B$B$G3N$+$a$k$3$H$,$G$-$k!%(B $B4D6-JQ?t$,3JG<$5$l$F$$$kJ8;zNs$X$N%]%$%s%?$O(B environ $B$H$$$&JQ?t$K3JG<$5$l$F$$$k!%(B $B=i4|CM$,@_Dj$5$l$J$$(B data0 $B$O(BBSS$B%;%/%7%g%s$KG[CV$5$l!$=i4|CM$r;}$D(B data1 $B$O%G!<%?%;%/%7%g%s$KG[CV$5$l$k!%(B

     1	#include <stdio.h>
     2
     3	extern char **environ;
     4
     5	int	data0;
     6	int	data1 = 10;
     7
     8	main(int argc, char *argv[])
     9	{
    10		char c;
    11
    12		printf("environ:\t%0.8p\n", environ);
    13		printf("argv:\t\t%0.8p\n", argv);
    14		printf("stack:\t\t%0.8p\n", &c);
    15
    16		printf("bss:\t\t%0.8p\n", &data0);
    17		printf("data:\t\t%0.8p\n", &data1);
    18	}

$B$3$N%W%m%0%i%`$r%3%s%Q%$%ke0L%"%I%l%9$K$"$j!$e0L%"%I%l%9$KMh$F$$$k$3$H$b$o$+$k!%(B

% ./a.out [$B
environ:	0xbffffc10
argv:		0xbffffc08
stack:		0xbffffb38
bss:		0x000030c4
data:		0x00003014
%

$B%W%m%;%9$NB0@-(B

PID$B!J%W%m%;%9(BID$B!K(B $B$=$l$>$l$N%W%m%;%9$K$D$1$i$l$k!$%W%m%;%9$r<1JL$9$k$?$a$NHV9f!%(BLinux$B$G$O(B 0$B!A(B32767 $B$NHO0O$N@0?t!%(B
PPID($B?F%W%m%;%9(BID) $B$=$N%W%m%;%9$r:n@.$7$?%W%m%;%9!J?F%W%m%;%9!K$N%W%m%;%9(BID$B!%(B
PGID$B!J%W%m%;%9%0%k!<%W(BID$B!K(B $B=jB0$9$k%W%m%;%9%0%k!<%W$N(BID$B!%%W%m%;%9%0%k!<%W$O!$$^$H$a$F%7%0%J%k$rAw$k>l9g$J$I$K;HMQ$5$l$k!%(B
UID$B!J%f!<%6(BID$B!K(B $B%W%m%;%9$r
GID$B!J%0%k!<%W(BID$B!K(B $B%W%m%;%9$r
$B%U%!%$%k%G%#%9%/%j%W%?(B $B%*!<%W%s$7$?%U%!%$%k$NI=!%(B
umask $B%U%!%$%k:n@.;~$N%b!<%I$r7h$a$k;~$K!$%^%9%/CM$H$7$F;HMQ$5$l$kCM!%(B
$B@)8fC $B%7%0%J%k$r
$B%+%l%s%H%G%#%l%/%H%j(B $B8=:_$N%G%#%l%/%H%j!%AjBP%Q%9L>$r;H$&>l9g$N=PH/E@$H$J$k!%(Bcurrent working directory$B$H$b8@$&!%(B
$B%k!<%H%G%#%l%/%H%j(B $B%k!<%H%G%#%l%/%H%j$O%W%m%;%9$4$H$K7h$a$k$3$H$,$G$-$k!%DL>o!$%"%/%;%9$G$-$k%U%!%$%k$r@)8B$9$k$?$a$K;HMQ$9$k!%(B
$B $B%s%S>uBV$+!$$J$I$N%W%m%;%9$NuBV!%(B
$BM%@h=g0L(B $B%W%m%;%9$N
$B%7%0%J%k@)8f>pJs(B $B%7%0%J%k$KBP1~$7$F$I$N=hM}$,9T$o$l$k$+$N>pJs!%(B
$BMxMQ2DG=;q8;NL(B $B%W%m%;%9$N;H$($k;q8;$N>e8B!%(B
$BpJs(B $B$3$l$^$G$N;q8;MxMQNL$NE}7W>pJs!%(B

$B4D6-JQ?t(B

$B%a%b%j%^%C%W$r3N$+$a$k(B$B%W%m%0%i%`(B$B$K4{$K=P$F$-$?$,!$%W%m%;%9$K$O4D6-JQ?t$OJ8;zNs$GEO$5$l!$$=$NJ8;zNs$N>l=j$O30ItJQ?t(B environ $B$K$h$j;X$7<($5$l$k!%(B $B4D6-JQ?t$r9=@.$9$kJ8;zNs$O!$9=B$E*$K$O(B argv $B$HF1$8$G$"$j!$(Benviron $B$OJ8;zNs$NG[Ns$X$N%]%$%s%?!J=>$C$F7?$O(B char ** $B!K$G$"$k!%(B

$B4D6-JQ?t$r!JJXMx$K!KA`:n$9$k$?$a$K0J2<$N%i%$%V%i%j4X?t$,MQ0U$5$l$F$$$k!%(B

char *getenv(const char *name);
int   putenv(char *string);
int   setenv(const char *name, const char *value, int overwrite);
void  unsetenv(const char *name);

$B%W%m%;%9$rA`:n$9$k%3%^%s%I(B

$B%W%m%;%9$KBP$7$F2?$i$+$NA`:n$r9T$&%W%m%0%i%`$K$O$$$m$$$m$"$k!%(B $B0J2<$O0lIt$N$h$/;HMQ$9$k%3%^%s%I$G$"$k!%(B

$B%7%'%k!J(Bsh, ksh, bash, zsh, csh, tcsh$B!K(B $B%3%^%s%I$N!%!%!%(B
ps, pstree, top $B%W%m%;%9$N4Q;!(B
kill $B%W%m%;%9$N!J6/@)!K=*N;(B
nice $B%W%m%;%9$N
limit $B%W%m%;%9$NMxMQ2DG=;q8;$N@)8f(B
gdb $B%G%P%C%0%D!<%k(B

$B$3$l$i$N%3%^%s%I$O!$B>$N%W%m%0%i%`$H2?$iJQ$o$k$3$H$,L5$/!$MM!9$J%7%9%F%`%3!<%k$r8F$S=P$9$3$H$G!$$=$N5!G=$r

$B%W%m%;%9$NA`:n!'%W%m%;%9:n@.!$%W%m%0%i%`

$B%W%m%;%9$N:n@.$H%W%m%0%i%`$N

$B35MW(B

$B%f!<%6$N%W%m%0%i%`$O%W%m%;%9$K$h$jo!$%f!<%6$,%7%'%k$N%3%^%s%I%W%m%s%W%H$N$H$3$m$K%3%^%s%IL>$rBG$A9~$`$H!$$=$N%3%^%s%I$,/$7>\$7$/8+$F$_$k$H!$(B

  1. $B%7%'%k$r$B:n@.$5$l$?%W%m%;%9$O!$;XDj$5$l$?%3%^%s%I$r$B%7%'%k$O!$%3%^%s%I$r$B%3%^%s%I$,=*N;$9$k$H!$%7%'%k$N $B$H$$$&%9%F%C%W$K$J$C$F$$$k!%$3$l$i$N%9%F%C%W$K$O$=$l$>$l0J2<$N%7%9%F%`%3!<%k$,BP1~$7$F$$$k!%(B

    pid_t fork(void);
    int   execve  (const char *filename, char *const argv[], char *const envp[]);
    pid_t wait(int *status)
    void  exit(int status);
    

    fork $B%7%9%F%`%3!<%k$O!$(Bfork $B%7%9%F%`%3!<%k$r8F$s$@%W%m%;%9$NJ#@=$r:n@.$9$k!%(B fork $B%7%9%F%`%3!<%k$r8F$s$@%W%m%;%9$,?F%W%m%;%9$H$J$j!$J#@=$5$l?7$?$K:n$i$l$?%W%m%;%9$,;R%W%m%;%9$K$J$k!%(B execve $B%7%9%F%`%3!<%k$O!$(Bexecve $B%7%9%F%`%3!<%k$r8F$s$@%W%m%;%9$K;XDj$5$l$?%W%m%0%i%`$r%m!<%I!$

    fork, execve, wait, exit $B$K$h$k%W%m%;%9$N:n@.!$%W%m%0%i%`$N

    $B%W%m%;%9$N:n@.(B
    

    UNIX$B$G$O!$%W%m%;%9$N:n@.$O(Bfork$B!$%W%m%0%i%`$N

    fork$B$K$h$k%W%m%;%9$N:n@.$H(Bexecve$B$K$h$k%W%m%0%i%`$N$,!J>/$7$O!K2r$1$k$+$b$7$l$J$$!%(B

    $B%W%m%0%i%`Nc!J(Bfork$B!K(B

    $B0J2<$O!$4JC1$N$?$a$K(B exec $B$r$;$:!$(Bfork, wait, exit$B$@$1$r;H$C$?%W%m%0%i%`Nc$G$"$k!%(B

    fork$B$O<+J,$r%3%T!<$7$F;R%W%m%;%9$r:n$k!%(B $B8=:_l=j$b%3%T!<$9$k!%(B $B=>$C$F!$(B$B;R%W%m%;%9$O(B fork $B$+$iLa$k$H$3$m$+$i%W%m%;%9$N$B!%(B fork $B$r8F$S=P$7$??F%W%m%;%9$b(B fork $B$+$iLa$k!JF1$8$/(B19$B9TL\!K!%(B $B$I$A$i$,?F$G$I$A$i$,;R$+$O!$(Bfork $B$NLa$jCM$+$iH=JL$9$k$3$H$,$G$-$k!J(B24$B9TL\!K!%(B fork $B$O?F%W%m%;%9$K$O@8@.$7$?;R%W%m%;%9$N%W%m%;%9(BID$B$rLa$jCM$H$7$FJV$9!%(B $B;R%W%m%;%9$K$O(B 0 $B$rJV$9!%(B fork $B$,<:GT$7$?;~$K$OIi$NCM$rJV$9!%(B

    $B?F%W%m%;%9$O(B fork $B$N8e(B wait $B$r8F$S=P$7!$;R%W%m%;%9$,=*N;$9$k$^$G

    $B;R%W%m%;%9$O(B getpid $B$G

    $B;R%W%m%;%9$,=*N;$9$k$H!$(Bwait $B$GBT$C$F$$$k?F%W%m%;%9$N

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	#include <sys/types.h>
         4	#include <sys/wait.h>
         5
         6	void
         7	do_child()
         8	{
         9		printf("This is child(pid=%d).\n", getpid());
        10
        11		exit(2);
        12	}
        13
        14	main()
        15	{
        16		int child, status;
        17
        18		if ((child = fork()) < 0) {
        19			perror("fork");
        20			exit(1);
        21		}
        22
        23		if (child == 0)
        24			do_child();
        25		else {
        26			if (wait(&status) < 0) {
        27				perror("wait");
        28				exit(1);
        29			}
        30			printf("The child (pid=%d) existed with status(%d).\n",
        31			    child, WEXITSTATUS(status));
        32		}
        33	}
    

    $B0J2<$O!$$3$N%W%m%0%i%`$r%3%s%Q%$%k!$

    % ./a.out [$B
    This is child(pid=23656).
    The child (pid=23656) existed with status(2).
    %
    

    $B%W%m%0%i%`Nc!J(Bexecve$B!K(B

    $B0J2<$O(B execve $B$r;HMQ$7$?4JC1$J%W%m%0%i%`Nc$G$"$k!%(B $B$3$N%W%m%0%i%`$O(B /bin/ls $B$r0z?t$J$7$Ge=q$-$5$l$k$h$&$K%m!<%I$5$l(B /bin/ls $B%W%m%0%i%`$N(B main $B4X?t$+$i

    execve $B$K$O!$0z?t!$4D6-JQ?t$O$=$l$>$l%W%m%;%9$,I,MW$H$9$k7A<0!J(Bargv$B7A<0!K$GEO$9I,MW$,$"$k!%(B argv $B$O!$(Bchar* $B7?$NG[Ns$r@k8@$7!J(B7$B9TL\!K!$MWAG$KCM$r%;%C%H$7$F$$$k!J(B9, 10$B9TL\!K!%(B $B4D6-JQ?t$O!$8=:_$N4D6-JQ?t$NCM$r$=$N$^$^EO$7$F$$$k!%(B

    execve $B$O!$%7%'%k$N$h$&$K$C$F!$

         1	#include <stdio.h>
         2
         3	extern char **environ;
         4
         5	main()
         6	{
         7		char *argv[2];
         8
         9		argv[0] = "/bin/ls";
        10		argv[1] = NULL;
        11
        12		execve(argv[0], argv, environ);
        13	}
    

    $B$C$F!$0J2<$N$h$&$K=q$$$F$b!$(B/bin/ls $B$O

         1	#include <stdio.h>
         2
         3	extern char **environ;
         4
         5	main()
         6	{
         7		char *argv[2];
         8
         9		argv[0] = "ls";
        10		argv[1] = NULL;
        11
        12		execve("/bin/ls", argv, environ);
        13	}
    

    execve $B$Gl9g$O!$(Bargv[1] $B0J9_$K;XDj$9$l$PNI$$!%(B $B0J2<$O(B /bin/ls / $B$r

         1	#include <stdio.h>
         2
         3	extern char **environ;
         4
         5	main()
         6	{
         7		char *argv[3];
         8
         9		argv[0] = "/bin/ls";
        10		argv[1] = "/";
        11		argv[2] = NULL;
        12
        13		execve(argv[0], argv, environ);
        14	}
    

    $B

    % ./a.out [$B
    Applications	Network		bin		home2		sbin
    Desktop DB	System		cores		mach		tmp
    Desktop DF	Users		dev		mach.sym	usr
    Developer	Volumes		etc		mach_kernel	var
    Library		automount	home1		private
    %
    

    $B%W%m%0%i%`Nc!J(Bfork&execve$B!K(B

    $B>e5-$N(B fork $B$N%W%m%0%i%`$H(B execve $B$N%W%m%0%i%`$rAH$_9g$o$;$k$H!$0J2<$N$h$&$K$J$k!%(B

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	#include <sys/types.h>
         4	#include <sys/wait.h>
         5
         6	extern char **environ;
         7
         8	void
         9	do_child()
        10	{
        11		char *argv[3];
        12
        13		printf("This is child(pid=%d)\n", getpid());
        14
        15		argv[0] = "/bin/ls";
        16		argv[1] = "/";
        17		argv[2] = NULL;
        18
        19		execve(argv[0], argv, environ);
        20	}
        21
        22	main()
        23	{
        24		int child, status;
        25
        26		if ((child = fork()) < 0) {
        27			perror("fork");
        28			exit(1);
        29		}
        30
        31		if (child == 0)
        32			do_child();
        33		else {
        34			if (wait(&status) < 0) {
        35				perror("wait");
        36				exit(1);
        37			}
        38			printf("The child (pid=%d) existed with status(%d).\n",
        39			    child, WEXITSTATUS(status));
        40		}
        41	}
    

    $B

    % ./a.out [$B
    This is child(pid=844)
    Applications	Network		bin		home2		sbin
    Desktop DB	System		cores		mach		tmp
    Desktop DF	Users		dev		mach.sym	usr
    Developer	Volumes		etc		mach_kernel	var
    Library		automount	home1		private
    The child (pid=844) existed with status(0).
    %
    

    $Bl9g!$(Bexecve $B$,<:GT$9$k2DG=@-$b9M$($J$1$l$P$J$i$J$$!%(B execve $B$O%W%m%0%i%`$N

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	#include <sys/types.h>
         4	#include <sys/wait.h>
         5
         6	extern char **environ;
         7
         8	void
         9	do_child()
        10	{
        11		char *argv[2];
        12
        13		printf("This is child(pid=%d)\n", getpid());
        14
        15		argv[0] = "/bin/xxxxx";
        16		argv[1] = NULL;
        17
        18		if (execve(argv[0], argv, environ) < 0) {
        19			perror("execve");
        20			exit(1);
        21		}
        22	}
        23
        24	main()
        25	{
        26		int child, status;
        27
        28		if ((child = fork()) < 0) {
        29			perror("fork");
        30			exit(1);
        31		}
        32
        33		if (child == 0)
        34			do_child();
        35		else {
        36			if (wait(&status) < 0) {
        37				perror("wait");
        38				exit(1);
        39			}
        40			printf("The child (pid=%d) existed with status(%d).\n",
        41			    child, WEXITSTATUS(status));
        42		}
        43	}
    

    $B>e5-$N%W%m%0%i%`$r

    % ./a.out [$B
    This is child(pid=856)
    execve: No such file or directory
    The child (pid=856) existed with status(1).
    %
    

    $B$=$NB>$N%7%9%F%`%3!<%k(B

    exit $B$O8=:_$O%i%$%V%i%j4X?t$H$J$C$F$*$j!$(B_exit $B$,%7%9%F%`%3!<%k$G$"$k!%(B $BFCDj$N%W%m%;%9$N=*N;$rBT$D$K$O(B waitpid $B$r;HMQ$9$k!%(B

    void  _exit(int status);
    pid_t waitpid(pid_t pid, int *status, int options);
    

    $B$J$<(B exit $B$O%i%$%V%i%j4X?t$K$J$C$F$$$k$N$+$O!$(Batexit(3) $B$r8+$F$_$k$H$o$+$k!%(B

    $B%W%m%0%i%`

    execve $B$O0z?t$d4D6-JQ?t$r(B argv $B7A<0$GEO$9I,MW$,$"$k!$$^$?%W%m%0%i%`$N%5!<%A$7$F$/$l$J$$$?$a!$$b$&>/$74JC1$K;H$($k$h$&$K$H!$0J2<$N%i%$%V%i%j4X?t$,MQ0U$5$l$F$$$k!%(B

    int  execl(const char *path, const char *arg, ...);
    int  execlp(const char *file, const char *arg, ...);
    int  execle(const char *path, const char *arg , ..., char * const envp[]);
    int  execv(const char *path, char *const argv[]);
    int  execvp(const char *file, char *const argv[]);
    

    execl, execlp, execle $B$O!$%3%^%s%I0z?t$NEO$7J}$,(B execve $B$H$O0[$J$j!$$3$l$i$N%i%$%V%i%j4X?t$N0z?t$H$7$F!$%3%^%s%I0z?t$N$N$h$&$KJ8;zNs$rJB$Y$FEO$9!%(B

         1	#include <stdio.h>
         2	#include <unistd.h>
         3
         4	main()
         5	{
         6		execl("/bin/ls", "ls", "/", NULL);
         7	}
    

    $B$^$?!$(Bexeclp, execvp $B$O4D6-JQ?t(B PATH $B$r;HMQ$7$F%3%^%s%I$r%5!<%A$7$F$/$l$k!%(B

         1	#include <stdio.h>
         2	#include <unistd.h>
         3
         4	main()
         5	{
         6		execlp("ls", "ls", "/", NULL);
         7	}
    

    $B%j%@%$%l%/%7%g%s!$%Q%$%W(B

    $B%j%@%$%l%/%7%g%s(B

    $B35MW(B

    $B%j%@%$%l%/%7%g%s$OI8=`F~=PNO$r%U%!%$%k$K$9$k5!G=$G$"$k!%(B $B0J2<$O!$%7%'%k$+$i(B ls $B$N7k2L$r%U%!%$%k$K=PNO$7$?$j!$(Bwc $B$X$NF~NO$r%U%!%$%k$K$7$?$j$7$F$$$k!%(B

    % ls *.c > a.txt [$B
    % wc < a.txt [$B
         38	     38	    374
    %
    

    $B%j%@%$%l%/%7%g%s$K$h$jF~=PNO$r%U%!%$%k$KBP$7$F9T$&$H$$$&=hM}$O(B ls, wc $B$H$OL54X78$K9T$o$l$F$$$k!%(B $B%W%m%;%9$NI8=`F~=PNO$O!$%U%!%$%k%G%#%9%/%j%W%?$N(B 0, 1, 2 $B$K3d$jEv$F$i$l$F$$$k!%(B $B$3$l$i$N%U%!%$%k%G%#%9%/%j%W%?$N@h$,2?$G$"$k$+$O!$%W%m%;%9$O4XCN$7$J$$!%(B $B%W%m%;%9$O(B 0 $B$OI8=`F~NO!$(B1 $B$OI8=`=PNO!$(B2 $B$OI8=`%(%i!<=PNO$G$"$k$H$7$F=hM}$r9T$&!%(B

    execve $B$O%W%m%0%i%`$re=q$-$7$=$N%W%m%0%i%`$N(B main $B4X?t$+$i$NB0@-$OJQ99$7$J$$!%(B $B$=$3$G%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$N@h$r%U%!%$%k$K$7$F$7$^$C$F$+$i(B execve $B$r8F$V$H!$(Bexecve $B$K$h$C$F5/F0$5$l$k%W%m%0%i%`$,I8=`F~NO$O$=$N%U%!%$%k$K$J$C$F$7$^$&!%(B $B=>$C$F!$I8=`F~NO$+$i$NFI$_9~$_$r9T$&$H!$$=$N%U%!%$%k$NFbMF$,FI$_9~$^$l$k$3$H$K$J$k!%(B $B$^$?!$%U%!%$%k%G%#%9%/%j%W%?(B 1 $B$N@h$r%U%!%$%k$K$7$F$7$^$C$F$+$i(B execve $B$r8F$V$H!$(Bexecve $B$K$h$C$F5/F0$5$l$k%W%m%0%i%`$,I8=`=PNO$X$N=q$-9~$_$O!$$=$N%U%!%$%k$X$N=q$-9~$_$H$J$k!%(B

    $B%U%!%$%k$NF~=PNO$N$?$a$N%U%!%$%k%G%#%9%/%j%W%?$NCM$H$7$F(B 0, 1, 2 $B$r;HMQ$9$k$K$O!$%U%!%$%k%G%#%9%/%j%W%?$NIU$1BX$($r$7$F$/$l$k%7%9%F%`%3!<%k(B dup, dup2 $B$r8F$V!%(B $B$I$A$i$b;XDj$5$l$?%U%!%$%k%G%#%9%/%j%W%?$NJ#@=$r:n@.$9$k!%(B $B8F=P$78e$O!$8E$$%U%!%$%k%G%#%9%/%j%W%?$b(B dup, dup2 $B$K$h$C$F:n@.$5$l$??7$7$$%U%!%$%k%G%#%9%/%j%W%?$b!$F1$8$b$N$H$7$F;HMQ$G$-$k>uBV$K$J$C$F$$$k!%(B $B8E$$%U%!%$%k%G%#%9%/%j%W%?$,ITMW$G$"$l$P(B close $B$7$J$1$l$P!$8E$$%U%!%$%k%G%#%9%/%j%W%?$OM-8z$J>uBV$K$J$C$F$$$k!%(B $B8E$$%U%!%$%k%G%#%9%/%j%W%?$r(B close $B$7$F$b!$?7$7$$%U%!%$%k%G%#%9%/%j%W%?$OM-8z$J$^$^$G$"$k!%(B

    int dup(int oldfd);
    int dup2(int oldfd, int newfd);
    

    dup $B$O%U%!%$%k%G%#%9%/%j%W%?$H$7$F;HMQ$5$l$F$$$J$$:G>.$NCM$r;HMQ$7!$(Bdup2 $B$O(B newfd $B$H$7$F;XDj$5$l$?CM$r;HMQ$9$k$H$$$&E@$@$1$,0[$J$k!%(B

    dup2 $B$r;HMQ$7$?%j%@%$%l%/%7%g%s$N@_Dj$r?^<($9$k$H!$0J2<$N$h$&$K$J$k!%(B

    $B%j%@%$%l%/%7%g%s$N=hM}(B
    

    1. $B%U%!%$%k$r%*!<%W%s$7!$!JNc$($P!K%U%!%$%k%G%#%9%/%j%W%?(B 3 $B$rF@$k!%(B
    2. $BI8=`F~NO!J%U%!%$%k%G%#%9%/%j%W%?(B 0$B!K$r%/%m!<%:$9$k!%(B
    3. dup2 $B$K$h$j!$%U%!%$%k%G%#%9%/%j%W%?(B 3 $B$NJ#@=$r%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$H$7$F:n@.$9$k!%(B
    4. $B%U%!%$%k%G%#%9%/%j%W%?(B 3 $B$r%/%m!<%:$9$k$3$H$K$h$j!$%U%!%$%k$O%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$+$i$N$_%"%/%;%9$G$-$k$h$&$K$J$k!%(B

    $B%W%m%0%i%`Nc(B

    $B0J2<$O!$Bh(B1$B0z?t$K;XDj$5$l$?%U%!%$%k$r!$(Bwc $B$NI8=`F~NO$H$9$k%W%m%0%i%`$G$"$k!%(B 15$B!A(B20$B9TL\$GBh(B1$B0z?t$K;XDj$5$l$?%U%!%$%k$r(B open $B$9$k=hM}$r9T$C$F$$$k!%(B 22$B9TL\$G%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$r%/%m!<%:$7!$:FMxMQ2DG=$J>uBV$K$7$F$$$k!%(B 23$B9TL\$G(B dup2 $B$r8F$S=P$7!$(B15$B9TL\$G%*!<%W%s$7$?%U%!%$%k$r%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$+$i$b%"%/%;%9$G$-$k$h$&$K$7$F$$$k!%(B 28$B9TL\$G(B15$B9TL\$N%*!<%W%s$GuBV$K$J$k!%(B 30$B9TL\$G(B execlp $B$r8F$S!$(Bwc $B$r5/F0$7$F$$$k!%(B $B%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$O(B15$B9TL\$G%*!<%W%s$7$?%U%!%$%k$H$D$J$,$C$F$$$k$?$a!$(Bwc $B$NI8=`F~NO$O$=$N%U%!%$%k$+$iFI$_9~$^$l$k$3$H$K$J$k!%(B

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	#include <unistd.h>
         4	#include <fcntl.h>
         5	
         6	main(int argc, char *argv[])
         7	{
         8		int file_fd;
         9	
        10		if (argc != 2) {
        11			printf("Usage: %s file_name\n", argv[0]);
        12			exit(1);
        13		}
        14	
        15		file_fd = open(argv[1], O_RDONLY);
        16		if (file_fd < 0) {
        17			perror("open");
        18			close(file_fd);
        19			exit(1);
        20		}
        21	
        22		close(0);
        23		if (dup2(file_fd, 0) < 0) {
        24			perror("dup2");
        25			close(file_fd);
        26			exit(1);
        27		}
        28		close(file_fd);
        29	
        30		execlp("wc", "wc", NULL);
        31	}
    

    $B0J2<$O!$>e5-%W%m%0%i%`$N

    % ./a.out a.txt [$B
         38	     38	    374
    %
    

    $B%Q%$%W(B

    $B35MW(B

    $B%7%'%k$G%3%^%s%I$rl9g!$%Q%$%W5!G=$rMQ$$$k$3$H$G!$$"$k%3%^%s%I$N=PNO$rJL$N%3%^%s%I$NF~NO$H$9$k$3$H$,$G$-$k!%(B $BNc$($P0J2<$N$h$&$K(B ls $B$N7k2L$r(B wc $B$NF~NO$K$9$k$3$H$K$h$C$F!$8=:_$N%G%#%l%/%H%j$K$"$k%U%!%$%k$d%G%#%l%/%H%j$N?t$r?t$($k$3$H$,$G$-$k!%(B $B0J2<$NNc$G$O(B .c $B$G=*$o$k(BC$B%W%m%0%i%`%U%!%$%k$N?t$r?t$($F$$$k!%(B

    % ls *.c | wc [$B
         38	     38	    374
    %
    

    $B%Q%$%W$r$b$&>/$7>\$7$/8+$F$_$k$H!$2

    $B%Q%$%W(B
    

    $B$3$N%Q%$%W$r$NDL$j(B pipe $B%7%9%F%`%3!<%k$G$"$k!%(B

    int pipe(int filedes[2]);
    

    pipe $B%7%9%F%`%3!<%k$r8F$V$H!$F~NO$H=PNO$=$l$>$l$N8}!J%U%!%$%k%G%#%9%/%j%W%?!K$r;}$D%Q%$%W$,(B1$BK\:n$i$l$k!%(B $B%U%!%$%k%G%#%9%/%j%W%?$O!$>e5-$NNc$@$H(B filedes $BG[Ns$K3JG<$5$l!$(Bfiledes[0] $B$,%Q%$%W$N=P8}!$(Bfiledes[1] $B$,%Q%$%W$NF~8}$N%U%!%$%k%G%#%9%/%j%W%?$K$J$k!%(B $B$3$N4X78$O!$%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$,I8=`F~NO!$%U%!%$%k%G%#%9%/%j%W%?(B 1 $B$,I8=`=PNO$G$"$k$3$H$HBPHf$5$;$k$H$o$+$j$d$9$$!%(B $BB($A!$(Bfiledes[0] $B$+$iFI$_!$(Bfiledes[1] $B$K=q$/!%(B

    $B%W%m%;%94V$N%Q%$%W$N:n@.$r?^<($9$k$H0J2<$N$h$&$K$J$k!%(B

    $B%Q%$%W$N:n@.(B
    

    1. pipe $B%7%9%F%`%3!<%k$r8F$V$H!$F~NO$H=PNO$=$l$>$l$N8}!J%U%!%$%k%G%#%9%/%j%W%?!K$r;}$D%Q%$%W$,(B1$BK\:n$i$l$k!%(B
    2. $B$3$N>uBV$G(B fork $B$r8F$V$H!$%Q%$%W!JF~=PNO$N8}!K$,N>J}$H$b6&M-$5$l$?>uBV$K$J$k!%(B
    3. $B0lJ}$N%W%m%;%9$,F~NO$r!$$b$&0lJ}$,=PNO$N8}$rJD$8$k$H!$%W%m%;%9$+$i%W%m%;%9$X%G!<%?$rAw$l$k!J%W%m%;%94VDL?.!K>uBV$K$J$k!%(B

    $B%W%m%0%i%`Nc(B

    $B0J2<$N(B$B%W%m%0%i%`(B$B$O!$%Q%$%W$r:n@.$7$?8e(B fork $B$r$7!$;R%W%m%;%9$+$i?F%W%m%;%9$XJ8;zNs$rAw$k%W%m%0%i%`$G$"$k!%(B

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3
         4	int pipe_fd[2];
         5
         6	void
         7	do_child()
         8	{
         9		char	*p = "Hello, dad!!\n";
        10
        11		printf("this is child.\n");
        12
        13		close(pipe_fd[0]);
        14
        15		while (*p) {
        16			if (write(pipe_fd[1], p, 1) < 0) {
        17				perror("write");
        18				exit(1);
        19			}
        20			p++;
        21		}
        22	}
        23
        24	void
        25	do_parent()
        26	{
        27		char	c;
        28		int	count, status;
        29
        30		printf("this is parent.\n");
        31
        32		close(pipe_fd[1]);
        33
        34		while ((count = read(pipe_fd[0], &c, 1)) > 0) {
        35			putchar(c);
        36		}
        37
        38		if (count < 0) {
        39			perror("read");
        40			exit(1);
        41		}
        42
        43		if (wait(&status) < 0) {
        44			perror("wait");
        45			exit(1);
        46		}
        47	}
        48
        49	main()
        50	{
        51		int child;
        52
        53		if (pipe(pipe_fd) < 0) {
        54			perror("pipe");
        55			exit(1);
        56		}
        57
        58		if ((child = fork()) < 0) {
        59			perror("fork");
        60			exit(1);
        61		}
        62
        63		if (child)
        64			do_parent();
        65		else
        66			do_child();
        67	}
    

    • 53$B9TL\$G%Q%$%W$r:n@.$7$?8e!$(B58$B9TL\$G(B fork $B$r$7$F$$$k!%(B
    • $B;R%W%m%;%9$O(B13$B9TL\$G%Q%$%W$N=P8}$r%/%m!<%:$7!$?F%W%m%;%9$O(B32$B9TL\$G%Q%$%W$NF~8}$r%/%m!<%:$9$k!%(B
    • $B;R%W%m%;%9$OJ8;zNs$r%Q%$%W$K=q$-9~$_!J(B15$B!A(B21$B9TL\!K!$?F%W%m%;%9$O$=$l$r%Q%$%W$+$iFI$_=P$9!J(B34$B!A(B36$B9TL\!K!%(B
    $B$3$N%W%m%0%i%`$r%3%s%Q%$%k
    % ./a.out [$B
    this is parent.
    this is child.
    Hello, dad!!.
    %
    

    $B>e5-$N%W%m%0%i%`$r(B dup2 $B$r;HMQ$7!$I8=`F~=PNO$r%Q%$%W$G@\B3$9$k$H0J2<$N$h$&$K$J$k!%(B $B%Q%$%W$NITMW$J=PF~8}$N%/%m!<%:!J(B13, 34$B9TL\!K$H!$(Bdup2 $B$K$h$k%j%@%$%l%/%7%g%s$N$?$a$N%/%m!<%:!J(B15, 20, 36, 41$B9TL\!K$H!$$?$/$5$s%/%m!<%:$r8F$VI,MW$,$"$k!%(B

         1	#include <stdio.h>
         2	#include <stdlib.h>
         3	
         4	int pipe_fd[2];
         5	
         6	void
         7	do_child()
         8	{
         9		char	*p = "Hello, dad!!\n";
        10	
        11		printf("this is child\n");
        12	
        13		close(pipe_fd[0]);
        14	
        15		close(1);
        16		if (dup2(pipe_fd[1], 1) < 0) {
        17			perror("dup2 (child)");
        18			exit(1);
        19		}
        20		close(pipe_fd[1]);
        21	
        22		while (*p)
        23			putchar(*p++);
        24	}
        25	
        26	void
        27	do_parent()
        28	{
        29		char	c;
        30		int	count, status;
        31	
        32		printf("this is parent\n");
        33	
        34		close(pipe_fd[1]);
        35	
        36		close(0);
        37		if (dup2(pipe_fd[0], 0) < 0) {
        38			perror("dup2 (parent)");
        39			exit(1);
        40		}
        41		close(pipe_fd[0]);
        42	
        43		while ((c = getchar()) != EOF)
        44			putchar(c);
        45	
        46		if (wait(&status) < 0) {
        47			perror("wait");
        48			exit(1);
        49		}
        50	}
        51	
        52	main()
        53	{
        54		int child;
        55	
        56		if (pipe(pipe_fd) < 0) {
        57			perror("pipe");
        58			exit(1);
        59		}
        60	
        61		if ((child = fork()) < 0) {
        62			perror("fork");
        63			exit(1);
        64		}
        65	
        66		if (child)
        67			do_parent();
        68		else
        69			do_child();
        70	}
    

    $B%W%m%;%9$N:n@.$H/$J$/$H$b!$(Bfork$B$H(Bexecve$B$,J,$+$l$F$$$k$3$H$K$h$j!$%j%@%$%l%/%7%g%s$d%Q%$%W$,4JC1$K

    $B$=$NB>$N%W%m%;%9A`:n$N$?$a$N%7%9%F%`%3!<%k!$%i%$%V%i%j4X?t(B

    $B%W%m%;%96/@)=*N;(B

    $BDL>o%W%m%;%9$r=*N;$9$k$?$a$K;HMQ$5$l$k(B kill $B%3%^%s%I$O!$(Bkill $B%7%9%F%`%3!<%k$r8F$V$3$H$G\$7$/=R$Y$k!%(B

    int kill(pid_t pid, int sig);
    

    $B%a%b%jNN0h3NJ](B

    malloc $B$O$G$-$k$@$1F0E*$K3NJ]$5$l(B free $B$K$h$j3+J|$5$l$?%a%b%jNN0h$r;H$$$^$o$9$h$&$K@_7W$5$l$F$$$k$,!$8=:_$N%R!<%WNN0h$@$1$G$O%a%b%jNN0h$,B-$j$J$/$J$C$?;~$K!$0J2<$N%R!<%WNN0h$r3HBg$9$k$?$a$N%7%9%F%`%3!<%k$,8F$S=P$5$l$k!%(B $B8F=P$78e$O%R!<%WNN0h$,3HBg$5$l!$?7$?$J%a%b%jNN0h3NJ]$,$G$-$k$h$&$K$J$k!%(B

    int  brk(void *end_data_segment);
    void *sbrk(ptrdiff_t increment);
    

    $B4JC1$J%W%m%0%i%`

    $B0J2<$N%i%$%V%i%j4X?t$O!$C1=c$J%W%m%;%9$N

    FILE *popen(const char *command, const char *type);
    int pclose(FILE *stream);
    int system (const char * string);
    

    $B$=$NB>$N%7%9%F%`%3!<%k(B

    $B0J2<$O!$%W%m%;%9$N

    int nice(int inc);
    int getrlimit(int resource, struct rlimit *rlim);
    int getrusage(int who, struct rusage *usage);
    int setrlimit(int resource, const struct rlimit *rlim);
    int ptrace(int request, int pid, int addr, int data);
    

    $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!$

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

    • $B%"%I%l%9%P%9(B
    • $B%G!<%?%P%9(B
    • $B@)8f%P%9!J%3%s%H%m!<%k%P%9!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(3)		 BSD Library Functions Manual		     SIGNAL(3)
    
    NAME
         signal -- simplified software signal facilities
    
    LIBRARY
         Standard C Library (libc, -lc)
    
    SYNOPSIS
         #include <signal.h>
    
         void (*
         signal(int sig, void (*func)(int)))(int);
    
         or in the equivalent but easier to read typedef'd version:
    
         typedef void (*sig_t) (int);
    
         sig_t
         signal(int sig, sig_t func);
    
    DESCRIPTION
         This signal() facility is a simplified interface to the more general
         sigaction(2) facility.
    
    .... $B0lIt>JN,(B ....
    
         No	   Name		Default Action	     Description
         1	   SIGHUP	terminate process    terminal line hangup
         2	   SIGINT	terminate process    interrupt program
         3	   SIGQUIT	create core image    quit program
         4	   SIGILL	create core image    illegal instruction
         5	   SIGTRAP	create core image    trace trap
         6	   SIGABRT	create core image    abort program (formerly SIGIOT)
         7	   SIGEMT	create core image    emulate instruction executed
         8	   SIGFPE	create core image    floating-point exception
         9	   SIGKILL	terminate process    kill program
         10	   SIGBUS	create core image    bus error
         11	   SIGSEGV	create core image    segmentation violation
         12	   SIGSYS	create core image    non-existent system call invoked
         13	   SIGPIPE	terminate process    write on a pipe with no reader
         14	   SIGALRM	terminate process    real-time timer expired
         15	   SIGTERM	terminate process    software termination signal
         16	   SIGURG	discard signal	     urgent condition present on socket
         17	   SIGSTOP	stop process	     stop (cannot be caught or ignored)
         18	   SIGTSTP	stop process	     stop signal generated from keyboard
         19	   SIGCONT	discard signal	     continue after stop
         20	   SIGCHLD	discard signal	     child status has changed
         21	   SIGTTIN	stop process	     background read attempted from control terminal
         22	   SIGTTOU	stop process	     background write attempted to control terminal
         23	   SIGIO	discard signal	     I/O is possible on a descriptor (see fcntl(2))
         24	   SIGXCPU	terminate process    cpu time limit exceeded (see setrlimit(2))
         25	   SIGXFSZ	terminate process    file size limit exceeded (see setrlimit(2))
         26	   SIGVTALRM	terminate process    virtual time alarm (see setitimer(2))
         27	   SIGPROF	terminate process    profiling timer alarm (see setitimer(2))
         28	   SIGWINCH	discard signal	     Window size change
         29	   SIGINFO	discard signal	     status request from keyboard
         30	   SIGUSR1	terminate process    User defined signal 1
         31	   SIGUSR2	terminate process    User defined signal 2
         32	   SIGTHR	terminate process    thread interrupt
    
    .... $B0J2<>JN,(B ....
    

    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 (*sig_t)(int);
    sig_t signal(int sig, sig_t func);
    

    $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 sig_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

  2. SIG_IGN$B!!%7%0%J%k$NL5;k(B
  3. 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

    • 7$B!A(B21$B9TL\!'%7%0%J%k%O%s%I%i$NDj5A!%(B3$B2s5/F0$9$k$H(B exit $B$r8F$V!%(B
    • 25$B9TL\!'(BSIGINT$B$KBP$9$k%7%0%J%k%O%s%I%i$H$7$F(B sigint_handler $B$r@_Dj(B
    • 31$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 <stdlib.h>
           3	#include <signal.h>
           4
           5	volatile sig_atomic_t sigint_count = 3;
           6
           7	void
           8	sigint_handler(int signum)
           9	{
          10		printf("sigint_handler(%d): sigint_count(%d)\n",
          11		    signum, sigint_count);
          12
          13		if (--sigint_count <= 0) {
          14			printf("sigint_handler: exiting ... \n");
          15			exit(1);
          16		}
          17
          18	#if 0	/* For the original System V signal */
          19		signal(SIGINT, &sigint_handler);
          20	#endif
          21	}
          22
          23	main()
          24	{
          25		signal(SIGINT, &sigint_handler);
          26
          27		for (;;) {
          28			printf("main: sigint_count(%d), calling pause ....\n",
          29			    sigint_count);
          30
          31			pause();
          32
          33			printf("main: return from pause. sigint_count(%d)\n",
          34			    sigint_count);
          35		}
          36	}
      

      5$B9TL\$N(B volatile sig_atomic_t $B$O8+47$l$J$$$+$b$7$l$J$$$,!$(B$B$=$N@bL@$O8e=R$9$k(B$B!%(B

      $B%3%s%Q%$%k!$ Ctrl-C $B$O(B ^C $B$H$7$FI=<($5$l$k!%(B $BAw$i$l$F$-$?%7%0%J%k$NHV9f$,%7%0%J%k%O%s%I%i(B sigint_handler $B$N0z?t$K$J$k$?$a!$(BSIGINT $B$NHV9f$G$"$k(B 2 $B$,(B sigint_handler $B$N0z?t$H$7$FEO$5$l$F$$$k$N$,$o$+$k!%(B

      % ./a.out [$B
      main: sigint_count(3), calling pause ....
      [C-C]^Csigint_handler(2): sigint_count(3)
      main: return from pause. sigint_count(2)
      main: sigint_count(2), calling pause ....
      [C-C]^Csigint_handler(2): sigint_count(2)
      main: return from pause. sigint_count(1)
      main: sigint_count(1), calling pause ....
      [C-C]^Csigint_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(B18$B!A(B20$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 Mac OS X $B$O%^%K%e%"%k$N$h$&$K(BBSD UNIX$B%Y!<%9$G$"$k$?$a!$$3$N(B signal $B$N(BAPI$B$rDs6!$7$F$$$k!%(B $B$=$N$?$a>e5-%W%m%0%i%`$N(B18$B!A(B20$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 {
	union {
		void	(*__sa_handler)(int);
		void	(*__sa_sigaction)(int, struct __siginfo *, void *);
	} __sigaction_u;		/* signal handler */
	int	sa_flags;		/* see signal options below */
	sigset_t sa_mask;		/* signal mask to apply */
};

#define sa_handler	__sigaction_u.__sa_handler
#define sa_sigaction	__sigaction_u.__sa_sigaction

  • 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$,!$

  • 24$B9TL\!'%9%?%C%/>e$K 25$B9TL\!'%7%0%J%k%O%s%I%i$O(B sigint_handler
  • 26$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
  • 28$B9TL\!'(Bsigaction $B$K$h$j%7%0%J%k$r@_Dj(B

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

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

    $B%3%s%Q%$%k!$ Ctrl-C $B$O(B ^C $B$H$7$FI=<($5$l$k!%(B $BDLCN$5$l$?%7%0%J%k$K$D$$$F$h$jB?$/$N>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]^Csigint_handler(2): sigint_count(3) signo(2) code(0x80)
    main: return from pause. sigint_count(2)
    main: sigint_count(2), calling pause ....
    [C-C]^Csigint_handler(2): sigint_count(2) signo(2) code(0x80)
    main: return from pause. sigint_count(1)
    main: sigint_count(1), calling pause ....
    [C-C]^Csigint_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 <stdlib.h>
         3	#include <signal.h>
         4	#include <string.h>
         5
         6	volatile sig_atomic_t sigint_count = 3;
         7
         8	main()
         9	{
        10		struct sigaction sa_ignore;
        11
        12		memset(&sa_ignore, 0, sizeof(sa_ignore));
        13		sa_ignore.sa_handler = SIG_IGN;
        14
        15		if (sigaction(SIGINT, &sa_ignore, NULL) < 0) {
        16			perror("sigaction");
        17			exit(1);
        18		}
        19
        20		while (1) {
        21			printf("main: sigint_count(%d), calling pause() ....\n",
        22			    sigint_count );
        23
        24			pause();
        25
        26			printf("main: return from pause().  sigint_count(%d)\n",
        27			    sigint_count );
        28		}
        29	}
    

    $B%3%s%Q%$%k!$ Ctrl-C $B$O(B ^C$B!$(BCtrl-Z $B$O(B ^Z $B$H$7$FI=<($5$l$k!%(B

    % ./a.out [$B
    main: sigint_count(3), calling pause() ....
    [C-C]^C[C-C]^C[C-C]^C[C-z]^Z
    Suspended
    % jobs [$B
    [1]  + Suspended		     ./a.out
    % kill -KILL %1 [$B
    % [$B
    [1]    Killed			     ./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		(void (*)(int))0
    #define SIG_IGN		(void (*)(int))1
    

    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 <stdlib.h>
         3	#include <signal.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%7%0%J%k%O%s%I%iFb$G$N=hM}$K$D$$$F$NCm0U(B

    $B>e5-$N%W%m%0%i%`$G!$%7%0%J%k%O%s%I%iFb$GCM$,JQ99$5$l$kJQ?t$O!$0J2<$N$h$&$K@k8@$7$F$$$k!%(B

    volatile sig_atomic_t sigint_count = 3;
    

    sig_atomic_t $B$O!$3d$j9~$^$l$:$K=q$-9~$_$,2DG=$JJQ?t$N7?$G$"$k!%(B volatile $B$O7?=$>~;R$H8F$P$l$k$b$N$G!$7?$NA0$KIU$1$F;HMQ$9$k!%(B volatile $B$rIU$1$k$3$H$G!$%3%s%Q%$%i$K$h$k:GE,2=$,M^;_$5$l!$$3$N>l9g(B sigint_count $B$KBP$9$kFI$_=q$-$O!$I,$:%a%b%j$KBP$7$F9T$J$o$l$k$h$&$K$J$k!%(B

    $B$3$N$h$&$J@k8@$,I,MW$JM}M3$O!$%7%0%J%k%O%s%I%i$N8F$S=P$7$,!$4X?t8F$S=P$7$N$h$&$K%W%m%0%i%`$N@)8f$NN.$l$K1h$C$?$b$N$G$O$J$/!$%W%m%0%i%`30It$N%$%Y%s%H$K5/0x$7HsF14|E*$K5/$3$k$b$N$@$+$i$G$"$k!%(B $B%W%m%0%i%`$N@)8f$NN.$l$K1h$C$F$$$k>l9g!$JQ?t$X$NFI$_=q$-$O%3%s%Q%$%i$N@)8f2<$K$"$k$?$a!$:GE,2=$K$h$j0l;~E*$K%l%8%9%?$KCV$+$l$F$$$kJQ?t$NCM$,@5$7$/;2>H$5$l$k!%(B $B$7$+$7!$%7%0%J%k%O%s%I%i$O!$K\Mh$N%W%m%0%i%`$N@)8f$NN.$l$H$OL54X78$K!$%W%m%0%i%`$Nl9g!$%7%0%J%k%O%s%I%i$O$=$N:G?7$NCM$K%"%/%;%9$9$k$3$H$O$G$-$J$$!%(B $B$^$?!$%7%0%J%k%O%s%I%i$,JQ?t$NCM$r=q$-49$($?$H$7$F$b!$3d$j9~$^$l$?%W%m%0%i%`$O$=$NJQ99$K5$$,$D$+$J$$$3$H$b$"$jF@$k!%(B

    volatile $B@k8@$5$l$?JQ?t$KBP$9$kFI$_=q$-$O!$I,$:%a%b%j$KBP$7$F9T$J$o$l$k$?$a!$%7%0%J%k%O%s%I%i$K$h$k3d$j9~$_$,5/$3$C$F$b!$:G?7$NCM$r;2>H$9$k$3$H$,$G$-$k!%(B $B$^$?!$(Bsig_atomic_t $B$O3d$j9~$^$l$:$K=q$-9~$_$,2DG=$JJQ?t$N7?$rDs6!$9$k$?$a!$JQ?t$NFI$_=q$-$NESCf$G3d$j9~$^$l$k$3$H$,$J$$!%(B $B$=$N$?$a!$0l4S@-$N$"$kCM$rFI$_=q$-$9$k$3$H$,$G$-$k!%(B

    $B%7%0%J%k%O%s%I%i$O!$K\Mh$N%W%m%0%i%`$N@)8f$NN.$K3d$j9~$s$G8F$S=P$5$l$k$?$a!$%W%m%0%i%`$N@)8f<+BN$KL7=b$r0z$-5/$3$9>l9g$b$"$k!%(B $B$=$N$h$&$JL7=b$r0z$-5/$3$7$F$7$^$&%i%$%V%i%j4X?t!$%7%9%F%`%3!<%k$O?tB?$/$"$k$?$a!$%7%0%J%k%O%s%I%iFb$G;HMQ2DG=$J%i%$%V%i%j4X?t!$%7%9%F%`%3!<%k$O@)8B$5$l$F$$$k!%(B

    $B%7%0%J%k%O%s%I%iFb$G;HMQ2DG=$J4X?t$N%j%9%H$K$D$$$F$O(B sigaction(2) $B$r;2>H$N$3$H!%(B

    $BNc$($P!$(Bprintf $B$O%7%0%J%k%O%s%I%iFb$G;HMQ2DG=$J4X?t$N%j%9%H$K$O4^$^$l$F$*$i$:!$%7%0%J%k%O%s%I%iFb$G;HMQ$9$k$Y$-$G$O$J$$!%(B write $B$O;HMQ2DG=$J$N$G!$%a%C%;!<%8$r=PNO$9$kI,MW$,$"$k>l9g$O!$(Bwrite $B$rMQ$$$k!%(B

    $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

    • ITIMER_REAL$B!!/$7!$;D$j;~4V$,(B 0 $B$K$J$C$?$i(B SIGALRM $B$,DLCN$5$l$k(B
    • ITIMER_VIRTUAL$B!!%W%m%;%9$,%f!<%6%W%m%0%i%`$r/$7!$;D$j;~4V$,(B 0 $B$K$J$C$?$i(B SIGVALRM $B$,DLCN$5$l$k(B
    • ITIMER_PROF$B!!%+!<%M%kFb$b4^$a$F%W%m%;%9$,/$7!$;D$j;~4V$,(B 0 $B$K$J$C$?$i(B SIGPROF $B$,DLCN$5$l$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$NCM$,

    $B%?%$%^$r%-%c%s%;%k$9$k$?$a$K$O(B it_value $B$K(B 0 $B$r;XDj$7$F!$(Bsetitimer $B$r8F$S=P$;$PNI$$!%(B

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

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

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

    % ./a.out [$B
    9: 1239709333
    8: 1239709334
    7: 1239709335
    6: 1239709336
    5: 1239709337
    4: 1239709338
    3: 1239709339
    2: 1239709340
    1: 1239709341
    0: 1239709342
    %