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

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

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

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

$B:#F|$NFbMF(B

$B%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

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:        0xbfffdc5c
argv:           0xbfffdc54
stack:          0xbfffdbe7
bss:            0x080496e8
data:           0x080495f0
%

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

    $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
    bin   dev  home    lhome  lost+found  mnt  proc  sbin  usr  work
    boot  etc  initrd  lib    misc        opt  root  tmp   var
    %
    

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

    $B

    % ./a.out [$B
    This is child(pid=23774)
    bin   dev  home    lhome  lost+found  mnt  proc  sbin  usr  work
    boot  etc  initrd  lib    misc        opt  root  tmp   var
    The child (pid=23774) 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 <sys/types.h>
         3  #include <sys/wait.h>
         4
         5  extern char **environ;
         6
         7  void
         8  do_child()
         9  {
        10          char *argv[2];
        11
        12          printf("This is child(pid=%d)\n", getpid());
        13
        14          argv[0] = "/bin/xxxxx";
        15          argv[1] = NULL;
        16
        17          if (execve(argv[0], argv, environ) < 0) {
        18                  perror("execve");
        19                  exit(1);
        20          }
        21  }
        22
        23  main()
        24  {
        25          int child, status;
        26
        27          if ((child = fork()) < 0) {
        28                  perror("fork");
        29                  exit(1);
        30          }
        31
        32          if (child == 0)
        33                  do_child();
        34          else {
        35                  if (wait(&status) < 0) {
        36                          perror("wait");
        37                          exit(1);
        38                  }
        39                  printf("The child (pid=%d) existed with status(%d).\n",
        40                      child, WEXITSTATUS(status));
        41          }
        42  }
    

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

    % ./a.out [$B
    This is child(pid=23797)
    execve: No such file or directory
    The child (pid=23797) 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$d(Bon_exit(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
         3  void
         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
         3  void
         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 14$B!A(B19$B9TL\$GBh(B1$B0z?t$K;XDj$5$l$?%U%!%$%k$r(B open $B$9$k=hM}$r9T$C$F$$$k!%(B 21$B9TL\$G%U%!%$%k%G%#%9%/%j%W%?(B 0 $B$r%/%m!<%:$7!$:FMxMQ2DG=$J>uBV$K$7$F$$$k!%(B 22$B9TL\$G(B dup2 $B$r8F$S=P$7!$(B14$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 23$B9TL\$G(B14$B9TL\$N%*!<%W%s$GuBV$K$J$k!%(B 25$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(B14$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 <fcntl.h>
         3
         4  void
         5  main(int argc, char *argv[])
         6  {
         7          int file_fd;
         8
         9          if (argc != 2) {
        10                  printf("Usage: %s file_name\n", argv[0]);
        11                  exit(1);
        12          }
        13
        14          file_fd = open(argv[1], O_RDONLY);
        15          if (file_fd < 0) {
        16                  perror("open");
        17                  close(file_fd);
        18                  exit(1);
        19          }
        20
        21          close(0);
        22          dup2(file_fd, 0);
        23          close(file_fd);
        24
        25          execlp("wc", "wc", NULL);
        26  }
    

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

    • 52$B9TL\$G%Q%$%W$r:n@.$7$?8e!$(B57$B9TL\$G(B fork $B$r$7$F$$$k!%(B
    • $B;R%W%m%;%9$O(B12$B9TL\$G%Q%$%W$N=P8}$r%/%m!<%:$7!$?F%W%m%;%9$O(B31$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(B14$B!A(B20$B9TL\!K!$?F%W%m%;%9$O$=$l$r%Q%$%W$+$iFI$_=P$9!J(B33$B!A(B35$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(B12, 30$B9TL\!K$H!$(Bdup2 $B$K$h$k%j%@%$%l%/%7%g%s$N$?$a$N%/%m!<%:!J(B14, 16, 32, 34$B9TL\!K$H!$$?$/$5$s%/%m!<%:$r8F$VI,MW$,$"$k!%(B

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

    $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

    $BF0E*%a%b%jNN0h3NJ]$N$?$a$K$O!$DL>o%i%$%V%i%j4X?t$G$"$k(Bmalloc$BKt$O(Bcalloc$B$r;HMQ$9$k!%(B malloc $B$K$h$j3NJ]$5$l$kNN0h$N=i4|CM$OITDj$G$"$k!%(B calloc $B$O3NJ]$7$?NN0h$r(B 0 $B$K=i4|2=$9$k!%(B $BF0E*$J%a%b%jNN0h$O3NJ]$H3+J|$r7+$jJV$9$3$H$,B?$$!%(B $B$=$N$?$a!$(Bmalloc$BKt$O(Bcalloc$B$O2?$i$+$N%"%k%4%j%:%`$rMQ$$$F8zN($h$/%a%b%jNN0h$N:FMxMQ$r2DG=$K$7$F$$$k!%(B

    malloc, calloc $B$G3NJ]$7$?NN0h$,ITMW$K$J$C$?$i!$(Bfree $B$K$h$j3+J|$9$k!%(B malloc, calloc $B$GNN0h3NJ]$r$7$F!$ITMW$K$J$C$F$b3+J|$7$J$$$^$^$GJ|CV$7$F$*$/$H!$:G=*E*$K$O;HMQ2DG=$J%a%b%jNL$rD6$($F!$%W%m%0%i%`$O0J>e=*N;$7$F$7$^$&!%(B $BFC$K!$3NJ]$7$?NN0h$X$N%]%$%s%?$r<:$C$F$7$^$$3+J|$G$-$J$/$J$C$F$7$^$&%P%0$O%a%b%j!<%j!<%/$H8F$P$l!$H/8+$7Fq$$%P%0$N0l$D$G$"$k!%(B

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

    $B8=:_$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$=$NB>$N%i%$%V%i%j4X?t(B

    $BN}=,LdBj(B

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

    printenv $B%3%^%s%I$O!$8=:_$N%W%m%;%9$N4D6-JQ?t$rI=<($7$F$/$l$k!%(B $BF1MM$NI=<($r$7$F$/$l$k%3%^%s%I$r!$(BC$B%W%m%0%i%`$H$7$F5-=R$;$h!%(B

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

    $B%a%b%j%^%C%W$r3N$+$a$k(B$B%W%m%0%i%`(B$B$r%3%s%Q%$%k$7!$7+$jJV$7l=j$,JQ$o$k$+!$$=$NM}M3$K$D$$$F9M$($F$_$J$5$$!%(B

    % ./a.out [$B
    environ:        0xbfffe8dc
    argv:           0xbfffe8d4
    stack:          0xbfffe867
    bss:            0x080496e8
    data:           0x080495f0
    % ./a.out [$B
    environ:        0xbfffe6dc
    argv:           0xbfffe6d4
    stack:          0xbfffe667
    bss:            0x080496e8
    data:           0x080495f0
    % ./a.out [$B
    environ:        0xbfffe7dc
    argv:           0xbfffe7d4
    stack:          0xbfffe767
    bss:            0x080496e8
    data:           0x080495f0
    %
    

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

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

         1  #include <stdio.h>
         2
         3  main()
         4  {
         5          fork();
         6          fork();
         7          fork();
         8          printf("hello\n");
         9  }
    

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

    system(3) $B$O!$%7%'%k$K$h$k%3%^%s%I$N

         1  #include <stdio.h>
         2  #include <stdlib.h>
         3
         4  main()
         5  {
         6          system("ls *.c | wc");
         7  }
    

    fork, execve$B!JKt$OAjEv$N%i%$%V%i%j4X?t!K!$(Bwait $B$J$I$r;HMQ$7$F!$(Bsystem(3)$BAjEv$N5!G=$r;}$D4X?t(B mysystem $B$r:n$j$J$5$$!%(B

    $B%^%K%e%"%k%Z!<%8$K5-=R$7$F$"$k%7%0%J%k$K$D$$$F$O!$L5;k$7$F$h$$!%(B

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

    $BI8=`F~NO$r%U%!%$%k$+$i%j%@%$%l%/%7%g%s$9$k(B$B%W%m%0%i%`(B$B$r$b$H$K!$I8=`=PNO$b%U%!%$%k$KBP$7$F$N=q$-9~$_$H$J$k$h$&$KJQ99$;$h!%(B $B=q$-9~$`%U%!%$%k$O!$%W%m%0%i%`$NBh(B2$B0z?t$H$7$F$H$k$b$N$H$9$k!%(B

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

    $BBh(B1$B0z?t$GM?$($i$l$k%3%^%s%I$N

    % ./if-then-else "test 1 -eq 1" "echo yes" "echo no" [$B
    yes
    % ./if-then-else "test 1 -eq 2" "echo yes" "echo no" [$B
    no
    %
    

    $B$H$J$k$h$&$J$b$N$r$G$"$k!%(B

    $B%3%^%s%I$N6h@Z$j$OJL$N$b$N$G$bNI$$!%(B $B0J2<$O(B then, else $B$,6h@Z$j$K$J$C$F$$$k!%(B execve $B$r;HMQ$9$k>l9g$O!$(Bargv $B$N(B then, else $B$NItJ,$r(B NULL $B$K$9$k$H(B execve $B$K$=$N$^$^EO$;$k$N$G!$0J2<$N$h$&$J6h@Z$j$N$[$&$,!$%W%m%0%i%`$O:n$j$d$9$$$+$b$7$l$J$$!%(B

    % ./if-then-else test 1 -eq 1 then echo yes else echo no
    

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

    fork $B$G%W%m%;%9$r:n$j!$?F%W%m%;%9$H;R%W%m%;%9$,8r8_$KJ8;z$r=PNO$9$k%W%m%0%i%`$r:n$j$J$5$$!%(B $B$^$?!$2?J8;z=PNO$9$k$+$O%W%m%0%i%`$X$N0z?t$G;XDj$G$-$k$h$&$K$7$J$5$$!%(B

    $B0J2<$O!$;R%W%m%;%9$O?t;z$r?F%W%m%;%9$O%"%k%U%!%Y%C%H$NBgJ8;z$r=PNO$9$k$h$&$K$7$F$_$?%W%m%0%i%`$G$N

    % ./a.out 30 [$B
    0A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6A7B8C9D
    %
    

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

    3$B8D$N%W%m%;%9$NI8=`F~=PNO$r(B2$B$D$N%Q%$%W$G7k$S$J$5$$!%(B

    $B%Q%$%W$N:n$jJ}$O!$@h$K%Q%$%W$r(B2$B$D:n$C$F$+$i(B2$B2s(B fork $B$9$kJ}K!$H!$(B1$B$D%Q%$%W$r:n$j(B fork $B$7!$$b$&(B1$B$D%Q%$%W$r:n$j$^$?(B fork $B$9$kJ}K!$,$"$k$,!$$I$A$i$G$bNI$$!%(B

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

    popen(3), pclose(3)$B$O!$%Q%$%W$K$h$j@\B3$5$l$?;XDj$5$l$?%W%m%0%i%`$r

    popen(3), pclose(3)$BAjEv$N5!G=$r;}$D4X?t(B mypopen, mypclose $B$r:n$j$J$5$$!%(B $B:G=i$O!$(Bpopen$B$G

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

    $B%Q%$%W$r;HMQ$9$k(B$B%W%m%0%i%`(B$B$r!$0J2<$N$h$&$K!$?F%W%m%;%9$+$i$N=PNO$r;R%W%m%;%9$NF~NO$K$9$k$h$&$K=q$-49$($?$H$3$m!$=*N;$7$J$/$J$C$F$7$^$C$?!%(B $B$=$NM}M3$r9M$(!$%W%m%0%i%`$N=$@5$;$h!%(B

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