tar and fifos

How can I make tar read data from a fifo, instead of storing it as a fifo?

What exactly do you want to do? i.e. what are you running that tar command for?
--EDIT:
Do you mean something like this:

# ls -l pipe
prw-rw-r--   1 root     other          0 Aug 22 12:37 pipe
# tar -cf - *.pl > pipe &
[1]     13153
# gzip < pipe > pl.tar.gz
[1] +  Done                    tar -cf - *.pl > pipe &
# 
# ls -l pl.tar.gz
-rw-rw-r--   1 root     other       1496 Aug 22 12:38 pl.tar.gz
# gzip -dc pl.tar.gz |tar -tvf - 
tar: blocksize = 16
-rwxrwxr-x   0/1      705 Aug 22 11:08 2006 cat.pl
-rwxrwxr-x   0/1      974 Jul 31 15:06 2006 daemon.pl
-rwxrwxr-x   0/1      340 Aug 22 11:37 2006 dates.pl
-rwxrwxr-x   0/1      148 Aug 21 14:51 2006 getserv.pl
-rwxrwxr-x   0/1      215 Aug 22 12:21 2006 num.pl
-rwxrwxr-x   0/1      142 Jul 31 15:06 2006 test.pl
# gzip -dc pl.tar.gz > pipe &
[1]     13159
# tar -tvf - < pipe
tar: blocksize = 16
-rwxrwxr-x   0/1      705 Aug 22 11:08 2006 cat.pl
-rwxrwxr-x   0/1      974 Jul 31 15:06 2006 daemon.pl
-rwxrwxr-x   0/1      340 Aug 22 11:37 2006 dates.pl
-rwxrwxr-x   0/1      148 Aug 21 14:51 2006 getserv.pl
-rwxrwxr-x   0/1      215 Aug 22 12:21 2006 num.pl
-rwxrwxr-x   0/1      142 Jul 31 15:06 2006 test.pl
[1] +  Done                    gzip -dc pl.tar.gz > pipe &
# 

As in, I have a directory with several fifos in it, with background processes suspended waiting to feed whatever opens them. I want the data from these processes to be in the tar file, not a little marker saying "this file's a fifo".

In other words, you have processes that write to fifos. Now you want tar to read from the fifos and write the output to a file/tape. Is that it?

Yes, exactly.

Well, see, there you have a problem. Cause tar needs filenames. Atleast the Solaris tar barfed saying something like that... If you just want to write to an output file, why not use dd?
--EDIT
Just tried tar on Linux and it failed too. Here's the simulation that I am using. It may not be anywhere near what you have, but its the closest that I'm gonna get.

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>

int main() {

        int fd,i;
        char a[2];

        fd=open("/tmp/pipe",O_WRONLY);
        if(fd==-1) {
                fprintf(stderr,"Error opening pipe: %d",errno);
                exit(-1);
        }
        for(i=65;i<91;i++) {
                sprintf(a,"%c",i);
                write(fd,&a[0],sizeof(char));
        }
        close(fd);
}

And here's how I am using dd:

$ ./a.out &
[1] 5795
$ dd if=/tmp/pipe bs=1
ABCDEFGHIJKLMNOPQRSTUVWXYZ26+0 records in
26+0 records out
26 bytes (26 B) copied, 0.000537 seconds, 48.4 kB/s
[1]+  Done                    ./a.out

Cheers

fifos have filenames.

I want to include several compressed disk images in a tar file, so that I can stream them at once across the local area network, without having to store compressed copies on disk before sending. dd is great for copying one stream, in fact I've been using up to this point and intended to use it to feed the fifos, but it cannot multiplex several in a manner easy to seperate at their destination.

tar is being entirely too smart for it's own good, apparently. It could work if it'd just open the files. Is there any older, dumber archiver I can use?

Not older, but you may have better luck with cpio or maybe even pax.

Checked it out, and neither of 'em seem to do what I want. Oh well.