tee like program to pipe to another program?
Will Renkel
renkel at motcid.UUCP
Tue Jun 11 00:36:12 AEST 1991
In article <PD.91Jun7133525 at powys.x.co.uk>, pd at pd@x.co.uk (Paul Davey) writes:
>
> >>>>> On 6 Jun 91 09:39:39 GMT, pete at othello.dartmouth.edu (Pete Schmitt) said:
>
> Pete> Is there a tee like program that will pipe down to another program?
>
> You can get the effect of this on some machines by using tee and a
> named pipe or fifo file. (This is not a general solution.)
>
> to pipe the output from lotsofdataprogram to stream1 and stream2,
>
>
> mknod fifo p
> lotsofdataprogram | tee fifo | stream1 ... &
> cat fifo | stream2 ...
>
>
> Don't forget to rm fifo when done with it.
>
> --
> Regards, pd at x.co.uk IXI Limited
> Paul Davey pd at ixi.uucp 62-74 Burleigh St.
> ...!uunet!ixi!pd Cambridge U.K.
> "These are interesting times" +44 223 462 131 CB1 1OJ
> USA: 1 800 XDESK 57
Got this code while working at ATT Bell Labs
I call it "branch" and its use is like the following
echo HI | branch 'grep HI | grep HI >stream1' | while read p1
do
echo $p1
done | tee stream2
--------- CUT HERE ----------------.
#include <stdio.h>
/* Similiar to the shell command "tee", but the standard input
* is copied into two different pipelines at the same time
*J. Leth, IH 6E-318 x6613. */
#define STRLEN 255
#define errexit(x,arg) fprintf(stderr, x, arg); exit(1)
main(argc, argv)
int argc;
char *argv[];
{
char *command;
int fildes[2]; /* file descriptors for created pipe
* fildes[0] is reader, fildes[1] is writer */
if (argc != 2)
{
printf("\n\nUsage:\tbranch <command>\n");
printf("Copies standard input to standard output, and\n");
printf("at the same time copies it to the given command.\n");
printf("The Command may itself be a pipeline (be careful\n");
printf("to enclose it in quotes).\n");
printf("example - cat abc | branch \"grep tss >temp1\" | grep qqq\n");
errexit("\n\n\n",1);
}
command = argv[1];
if (pipe(fildes) == -1) {
errexit("branch: can't get new pipe\n",0);
}
switch (fork())
{
case -1:
errexit("branch: can't fork\n",0);
case 0:
/* brancher process -- Execute command with standard input
* taken from pipe from forker process. */
close(fildes[1]); /* close writer */
/* Duplicate pipe reader as standard input */
close(0);
dup(fildes[0]);
execl("/bin/sh", "/bin/sh", "-c", command, 0);
default:
{ /* Forker process */
int c;
FILE *pipewrt;
close(fildes[0]); /* close reader */
pipewrt = fdopen(fildes[1], "w");
setbuf(pipewrt, NULL);
while(!feof(stdin) && !ferror(stdin)) {
putchar(c = getchar());
putc(c, pipewrt);
}
fclose(pipewrt);
fclose(stdin);
exit(0);
}
}
}
More information about the Comp.unix.questions
mailing list