.


:




:

































 

 

 

 


2 -

UNIX

 

UNIX.

 

  1. UNIX.
  2. :
    • ( , );
    • ;

.

. , 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);

}

 

 



<== | ==>
4- , | I . .
:


: 2015-11-05; !; : 935 |


:

:

.
==> ...

1679 - | 1651 -


© 2015-2024 lektsii.org - -

: 0.021 .