UNIX
UNIX.
- UNIX.
- :
- ( , );
- ;
.
. , 1.
3. , .
1. ,
fork() | , (), -, | |
wait(int *status) | - | |
execl() | exec , , . exec , , . | |
pipe(p) | p : int p[2]; p[0] , , p[1] , . | |
fdopen(<_> <__>) | fdopen open() | |
dup(p[0]) | , .. 0, p[0], .. p , | |
close(0) | 0 , .. |
1 -
: ls | wc, .
void main(void) /* LSWS.C */
/* */
/* ls wc */
{
int pid, pid2;
int fd[2];
int status, dead;
switch(pid = fork())
{
case -1: /* C fork() */
printf(" fork() #1 \n");
exit(1);
case 0: /* #1 */
pipe(fd);
switch(pid2 = fork())
{
case -1: /* C fork() */
printf(" fork() #2 \n");
exit(2);
case 0: /* #2 */
close(0); dup(fd[0]); close(fd[0]); close(fd[1]);
execl("/usr/bin/wc", "wc", 0);
|
|
puts(" WC \n");
exit();
default: /* */
close(1); dup(fd[1]);
close(fd[1]); close(fd[0]);
execl("/bin/ls", "ls", 0);
puts(" LS\n");
exit();
default: /* */
dead = wait(&status);
exit();
}
}
2 -
: ( ) -.
( . ) :
.R
aaaaaaa
.B
ccccccc
...
2 :
textcount count ;
count textcount .
, p q.
. 1.
(Count), stdin ( 1) stdout ( 2), .. getchar() printf().
#include <stdio.h>
#define R 0 /* stdin */
#define W 1 /* stdout */
#define True 1
#define FALSE 0
#define PERIOD '.'
void main(void) /* Textcount.c */
{
int pid;
int p[2], q[2];
FILE *fdopen(), *fp;
int c;
int newline = TRUE;
int total;
/* p q */
pipe(p);
pipe(q);
/* p[R], q[R] - */
/* p[W], q[W] - */
switch(pid = fork())
{
case 0: /* */
/* p[R] */
/* q[W] */
/* p[W] q[R] - */
/* . p[R] - */
/* . q[W] */
/* P */
close(p[W]);
close(R); dup(p[R]); close(p[R]);
/* . p[R] - */
/* Q */
close(q[R]);
close(W); dup(q[W]); close(q[W]);
/* . q[W] - */
/* Count */
execl("count", "count", 0);
printf("textcount: ");
exit(1);
case -1: /* C fork() */
printf(" fork() \n");
exit(1);
default: /* */
/* P */
/* */
close(p[R]); close(q[W]);
fp = fdopen(p[W], "w");
/* COUNT */ while((c=getchar()!= EOF)
{
switch(newline)
{
case TRUE:
if (c == '\n') /* */
putc(c, fp);
else if (c == PERIOD)
/* */
while((c=getchar()!= EOF && c!= '\n');
else
{
putc(c, fp);
newline = FALSE;
}
break;
default:
putc(c, fp);
if (c == '\n')
newline = TRUE;
}
}
fclose(fp); /* */
/* EOF */
/* */
/* Q */
close(R); dup(q[R]); close(q[R]);
scanf("%d", &total);
|
|
printf(" %d\n", total);
exit(0);
}
}
/* Count , Textcount */
void main(void) /* COUNT.C */
/* , COUNT, */
/* , */
/* P, */
/* - Q */
/* */
{
int count = 0;
while (getchar()!= EOF)
count++; printf("%d\n", count);
}