Cover V02, I04
Article
Listing 1
Listing 2
Listing 3
Sidebar 1

jul93.tar


Listing 2: read pipe() example

1  /* Listing 2
2   * read pipe() example
3   */
4  #include <stdio.h>
5  #define MAX_LINES   99
6  #define MAX_CHARS   4000
7  #define MAX_TXT 256
8
9  main()
10  {
11  char *slines[MAX_LINES];
12  char sbuf[MAX_CHARS];
13  char *com_str="who|sort|pr -n -t|grep -v '^[ \\t]*$'";
14  int count,i;
15
16  count=run_rpipe(slines, sbuf, com_str);
17  printf("count is %d\n", count);
18  for(i=0; i<count;   i++)
19       printf("%s\n", slines[i]);
20  }
21  /*
22  *   This function:
23  *   1) creates a pipe with pipe().
24  *   2) creates another process with fork().
25  *   3) couples standard output to the writing end of the pipe
26  *      using the dup() call.
27  *   4) closes file descriptors.
28  *   5) executes the child process.
29  *   6) closes the write side of the pipe.
30  *   7) opens the read side of the pipe using fdopen().
31  *   8) reads to the end of the pipe.
32  *   9) closes the file pointer.
33  *
34  *   buffer is the array where each line is stored.
35  *   lineptr is an array-of-pointers where each element of the
36  *   array points to the beginning of each line stored in buffer.
37  *
38  *   returns the number of lines read into buffer, cnt.
39  */
40  int run_rpipe(lineptr, buffer, exe_str)
41  char *lineptr[]; /*array-of-pointers to store addresses */
42  char buffer[];   /*buffer to store strings */
43  char *exe_str;   /*pipe command */
44  {
45  int i, p[2], pid,   cnt=0;
46  FILE *ptr, *fdopen();
47  char *bufstart, *bufend, line[MAX_TXT], *fgets();
48
49  bufstart = buffer;
50  bufend = buffer +   MAX_CHARS;
51
52  if(pipe(p) < 0)
53       fatal("pipe call");
54
55  switch(pid=fork())
56       {
57       case -1:
58          fatal("fork call in run_rpipe");
59       case 0:
60          close(1);    /*close the standard output */
61          dup(p[1]);   /*write side of the pipe*/
62          close(p[0]); /*save the file descriptors*/
63          close(p[1]);
64          execlp("/bin/sh", "sh", "-c", exe_str, NULL);
65          fatal("exec call in run_rpipe");
66        }
67  close(p[1]);       /*close the write side of the parent*/
68  if((ptr=fdopen(p[0],"r")), ptr ==   NULL)
69       fatal("fdopen call in run_rpipe");
70
71  for(i = 0; i < MAX_LINES;   i++)
72       {
73       if(fgets(line, MAX_TXT, ptr) == NULL)
74          break;
75       line[strlen(line)-1] = '\0';
76       if((bufstart + strlen(line) + 1) >= bufend)
77          fatal("Line too long");
78       lineptr[i]=bufstart;
79       strcpy(bufstart,line);
80       bufstart += strlen(line)+1;
81       cnt++;
82       }
83  fclose(ptr);
84  /*wait for child process to finish*/
85  while(wait((int *)0) != pid)
86       ;
87  return cnt;
88  }
/* End of File */