Newsgroups: fj.unix
Path: galaxy.trc.rwcp.or.jp!news.trc!nf2.iij.ad.jp!nr0.iij.ad.jp!news.iij.ad.jp!asahi-net!Q.T.Honey!tamaru-news!kuee-news!odins-suita!news.cs.ritsumei.ac.jp!newshub.bkc.ritsumei.ac.jp!cancer.nca5.ad.jp!nfeed.gw.nagoya-u.ac.jp!vega2!arisawa
From: arisawa@vega2.aichi-u.ac.jp (Kenji Arisawa)
Subject: fork&pipe(Re: boring unix)
Sender: news@vega2.aichi-u.ac.jp (News Master)
Message-ID: <EnItuE.Apr@vega2.aichi-u.ac.jp>
Date: Thu, 29 Jan 1998 01:08:38 GMT
References: <6amaqs$73v$1@us.fxis.co.jp>
Nntp-Posting-Host: vega2
Organization: Aichi University Computer Center, Aichi University, Aichi, Japan.
X-Newsreader: mnews [version 1.18PL3+] 1994-08/01(Mon)
Lines: 144
Xref: galaxy.trc.rwcp.or.jp fj.unix:3834
X-originally-archived-at: http://galaxy.rwcp.or.jp/text/cgi-bin/newsarticle2?ng=fj.unix&nb=3834&hd=a
X-reformat-date: Mon, 18 Oct 2004 15:18:22 +0900
X-reformat-comment: Tabs were expanded into 4 column tabstops by the Galaxy's archiver. See http://katsu.watanabe.name/ancientfj/galaxy-format.html for more info.

$BM-_7(B@$B0&CNBg3X$G$9(B

$B?@8M$5$s(B:
> > > $BB?!9$"$j$^$9!#C1$K(Bexec$B$9$k$@$1$@$H!"$=$&$$$C$?@_Dj$r(Bexec$BE*$J%7%9%F%`(B
> > > $B%3!<%k$N0lIt$H$7$FEO$9$H$+$$$C$?KbK!$r;H$o$J$1$l$P$J$j$^$;$s!#(B
> > $B?@8M$5$s$NG'<1$@$H!"(BOS9$B$G$O(Bshell$B$,$I$&$7$F:n$l$?$N$@$m$&$+$H5?Ld$K(B
> > $B;W$o$J$$$G$7$g$&$+$M(B?
> $B5U$G$9!#%Q%$%W$N=hM}$J$s$+$O$I$&$7$F$k$s$G$7$g$&$+(B?

UNIX$B$N(B fork $B$N7o$G$9$,!"(BOS9$B$HHf3S$7$F$I$3$K;H$$J}$N0c$$$,8=$o$l$k$+!"(B
$B6qBNNc$rDL$7$F2r@b$7$^$9!#(B

$B0J2<$O(B
ls -l | tr a-z A-Z
$B$r<B8=$9$k(BC$B$N%W%m%0%i%`$G$9!#(BNEXTSTEP$B$N%3!<%I$J$N$GB>$N(BOS$B$HB?>/$N0c$$$,(B
$B$"$k$+$bCN$l$^$;$s!#(B

#include <fcntl.h>
main()
{   int fd[2];
    pipe(fd); /* create pipe */
if(!fork()){ /* child process */
close(fd[1]);
  dup2(fd[0],0);
/* then we do something like ... */
    execl("/usr/bin/tr","tr","a-z","A-Z",0);
/* not reached */
  }

    /* parent process */
close(fd[0]);
dup2(fd[1],1);
/* then we do something like ... */
execl("/bin/ls","ls","-l",0);
/* not reached */
}

$B$H$3$m$G(Bfork$B$ND>8e$K(Bexec$B$r<B9T$9$k$h$&$K0J2<$N%W%m%0%i%`$r%H%i%$$7$^$7$g$&!#(B
#include <fcntl.h>
main()
{   int fd[2],b0,b1;
    pipe(fd); /* create pipe */
b0 = dup(0); /* make a back up of 0 */
b1 = dup(fd[1]); /* make a back up of fd[1] */
close(fd[1]);
dup2(fd[0],0);
if(!fork()){ /* child process */
/* then we do something like ... */
    execl("/usr/bin/tr","tr","a-z","A-Z",0);
/* not reached */
  }
    /* parent process */
dup2(b0,0); /* restore 0 */
dup2(b1,fd[1]);/* restore fd[1] */
close(fd[0]);
dup2(fd[1],1);
/* then we do something like ... */
execl("/bin/ls","ls","-l",0);
/* not reached */
}

$B$H$+$7$3$l$O9*$/9T$+$J$$!#M}M3$O;R%W%m%;%9$G$O%Q%$%W$NJRJ}$r40A4$KJD$8$k(B
$BI,MW$,$"$k$+$i$G$9!#$3$NLdBj$O(B READ+WRITE $B$G%*!<%W%s$G$-$k%Q%$%W$,$"$l$P(B
$B2r7h$7$^$9!#$=$3$G<!$N$h$&$K$7$^$7$g$&!#(B

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
main()
{   int fd,b;
mknod("/tmp/pipe",0600|S_IFIFO,0);/* create pipe device */
    fd = open("/tmp/pipe",O_RDWR);

b = dup(0); /* make a backup of 0 */
dup2(fd,0);
close(fd);

if(!fork()){ /* child process */
/* then we do something like ... */
    execl("/usr/bin/tr","tr","a-z","A-Z",0);
/* not reached */
  }
    /* parent process */
dup2(0,1);
dup2(b,0); /* restore 0 */
/* then we do something like ... */
execl("/bin/ls","ls","-l",0);
/* not reached */
}
$B$3$N%W%m%0%i%`$O0l8+@5$7$/F0:n$9$k$h$&$K8+$($^$9$,!"<B$OLdBj$,$"$j$^$9!#(B
$B;R%W%m%;%9$,%G!<%?$N=*$o$j$rG'<1$7$F$$$J$$$N$G$9!#$=$N$?$a(B ps $B$G$_$k$H(B
$B;R%W%m%;%9$,;D$C$F$$$k$N$,J,$+$j$^$9!#(B($B2r7h$N;EJ}$rCN$C$F$$$k?M$O(B
$B65$($F2<$5$$!#(B)

$B$5$i$K(B /tmp/pipe $B$,;D$k$H8@$&LdBj$b$"$j$^$9!#(B

OS9$B$G$O2?8N(B fork+exec$B$r(B1$B$D$KE;$a$k$3$H$,=PMh$?$+$H8@$($P%Q%$%W$KBP$9$k(B
$B9M$(J}$N0c$$$K$"$j$^$9!#(B
OS9$B$K$*$$$F$O%Q%$%W$b%U%!%$%k(B($B$"$k$$$O%G%P%$%9(B)$B$G$"$j!"(B/pipe $B$O%W%m%;%9Kh$K(B
$BB?=E2=$5$l$F$$$^$9!#(B
$B$=$N7k2L$H$7$F!">e$N%W%m%0%i%`$O(B(UNIX$BN.$K=q$1$P(B)$B0J2<$N$h$&$K$J$j$^$9!#(B
#include <fcntl.h>
main()
{   int fd,b;
    fd = open("/pipe",O_RDWR); /* open pipe */
b = dup(0); /* make a back up of 0 */
dup2(fd,0);
if(!fork()){ /* child process */
/* then we do something like ... */
    execl("/usr/ucb/wc","wc",0);
/* not reached */
  }
    /* parent process */
dup2(b,0); /* restore 0 */
dup2(fd,1);
/* then we do something like ... */
execl("/bin/ls","ls","-l",0);
/* not reached */
}

OS9$B$K$*$$$F$O(B exec $B$r7s$M$?(B fork $B$9$J$o$A(B os9fork $B$,$3$N$h$&$K;H$o$l$F(B
$B$$$^$7$?!#(B

UNIX$B$K$*$$$F$O%Q%$%W$OCfESH>C<$JCO0L$K$"$j$^$9!#(B
$B$=$b$=$b(B UNIX $B$N(B pipe(fd) $B$N$h$&$J%Q%$%W$N@8@.4X?t$O$A$C$H$b(BUNIX$B$i$7$/$J$/!"(B
OS9$B$NJ}$,$h$C$]$I(BUNIX$B$N;WA[$KCi<B$@$H;W$$$^$;$s$+(B?

UNIX$B$N0z?t$J$7$N(Bfork$B$O<B$O$b$&(B1$B$D$NM}M3$,$"$C$F!"(Bexec$B$7$J$$$GC1$K(Bfork$B$9$k(B
$B;H$$J}$,$"$j$^$9!#$3$N$h$&$J;H$$J}$OE57?E*$K$ODL?.%W%m%0%i%`(B tip $B$NCf$G9T(B
$B$o$l$F$*$j<u?.$HAw?.$GLr3d$,J,C4$5$l$F$$$^$9!#(Btip $B$ODL?.@_Dj$r9T$C$F$+$i(B
 fork $B$7$F$*$j!"$=$l$K$h$C$F;R%W%m%;%9$K$=$N@_Dj$,EO$;$^$9!#(B
$B$7$+$7$3$l$O5)$J;H$$J}$G$9$M!#$b$7$b?F;R$N%W%m%;%9$N4V$G6&M-%a%b%j$,(B
$B;H$($k$J$i!"$3$N$h$&$J;H$$J}$N0Y$K$o$6$o$6(BUNIX$BN.$N(Bfork$B$K$7$J$/$F$b(B
$B8zN($NNI$$(BOS9$BN.$G9=$o$J$$$O$:$G$9!#(B
($B:#$J$iJBNs8@8l$r;H$C$F<B8=$9$kJ}$,MZ$+$K%(%l%,%s%H$K$d$C$F$$$1$k(B)

$B$3$N$h$&$K9M$($k$H(BUNIX$BN.$N0z?t$J$7$N(Bfork$B$O(BUNIX$B$N7gE@$+$i(B($B$"$k$$$O(B
$B;~BeE*$J@)Ls$+$i(B)$BH/@8$7$?$b$N$G$"$j!";?H~$5$l$k$b$N$G$O$J$$$H;W$((B
$B$^$9$,G!2?$G$7$g$&(B? 
$BKM$O(B UNIX $B$N(B fork $B$N%W%m%0%i%_%s%0%$%s%?!<%U%'!<%9$O4q$rjJ$C$F$$$k=j$,(B
$B$"$C$F7y$$$J$N$G$9!#(B

$BM-_77r<#(B
E-mail: arisawa@aichi-u.ac.jp
