UNIX fifo concurrent read from a named pipe


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting UNIX fifo concurrent read from a named pipe
# 1  
Old 02-22-2018
Wrench UNIX fifo concurrent read from a named pipe

I have created a fifo named pipe in solaris, which writes the content of a file, line by line, into pipe as below:
Code:
$ mkfifo namepipe

$ cat books.txt
"how to write unix code"
"how to write oracle code"

$ cat books.txt >> namepipe &

I have a readpipe.sh script which reads the named pipe in parallel like this:
Code:
# readpipe.sh

while IFS=',' read var
do
  echo var >> log.txt

done < namepipe

I am calling the readpipe.sh like
Code:
readpipe.sh &
sleep 2
readpipe.sh &

I have introduced a sleep 2 to avoid a race condition to occur, i.e. two processes get parts of values from each line

The problem I am facing is when the all the contents of namepipe is completed, the first background process gets exited, while the second keeps on running without completing.

The logic in script is declared simple in here for clear understanding. Actual readpipd.sh does lots of activities.

Kindly help me with knowledge
# 2  
Old 02-22-2018
  • You need a wait statement after the second readpipe.sh
  • echo var >> log.txt . The $ sign is left out of the variable expansion and you need to quote the variable.
  • Why are you appending instead of writing to the pipe
  • The first readpipe will read all there is in the pipe. The second one gets nothing

Last edited by Scrutinizer; 02-22-2018 at 05:18 AM..
# 3  
Old 02-22-2018
Probably best to use a mutex/semaphore to ensure only 1 process only reads from the pipe at a time.

I don't know what OS you are using so not sure if lockfile(1) is available to you.

This solution uses a lock directory as mkdir is supposed to be atomic:

readpipe.sh
Code:
lockdir=lock.dir

get_book() {
   local DONE=0
   while ! mkdir $lockdir 2> /dev/null
   do
      sleep 0.02
   done

   IFS="," read -u7 var || DONE=1

   rmdir $lockdir
   return $DONE
}

exec 7< namepipe
while get_book
do
   echo "$var" >> log$$.txt
done
exec 7<&-

Here is my test:

Code:
$ cat naveen 
mkfifo namepipe
./readpipe.sh &
./readpipe.sh &
exec 3<> namepipe
cat books.txt >&3
# Give time for readers to get established
sleep 1
# Close the write end
exec 3>&-
# wait for readers to complete
wait

$ ./naveen 

$ wc -l books.txt log*
 200 books.txt
 106 log2838.txt
  94 log2839.txt
 400 total

$ diff <(sort books.txt) <(cat log* | sort)


Update: below is an example using flock(1):

Code:
lockfile=lock.file

get_book() {
  var=$( (
      if flock -w .007 -n 200
      then
        IFS="," read -u7 var || exit 1
        echo "$var"
      fi) 200>$lockfile )
}

exec 7< namepipe

while get_book
do
  if [ -n "$var" ]
  then
          # Do any required work with the book record here...
          echo "$var" >> log$$.txt
  fi
done
exec 7<&-


Last edited by Chubler_XL; 02-25-2018 at 11:56 PM.. Reason: Added sleep to writer before close - avoid 1 process hogging the fifo
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

UNIX Pipe -Exit when there are no bytes to read

Hi All, I'm creating a program which reads millions of bytes from the PIPE and do some processing. As the data is more, the idea is to read the pipe parallely. Sun Solaris 8 See the code below: #!/bin/sh MAXTHREAD=30 awk '{print $1}' metadata.csv > nvpipe & while do ... (3 Replies)
Discussion started by: mr_manii
3 Replies

2. Shell Programming and Scripting

awk reading from named pipe (fifo)

I'm trying to read a fifo using awk and comming across some problems. I'm writing to the fifo from multiple processes invoked by GNU Parallel: mkfifo my_fifo awk '{ a = a + $2 } END { for (i in a) print i, a }' my_fifo | sort -nk1 > sorted_output grep -v '^@' massive_file | parallel... (3 Replies)
Discussion started by: nathanhaigh
3 Replies

3. Programming

Pipe & fifo size limit

Hi guys. 1. how much is the size of pipe?(i mean the buffer size) 2. is this size different in various UNIX derivations? 3. what happens if we write to a full pipe? does it block until get some free space(the other side receive data) or returns an error? 3. FIFO s are physical files on the... (2 Replies)
Discussion started by: majid.merkava
2 Replies

4. UNIX for Advanced & Expert Users

Why not SIGPIPE for readers of pipe/FIFO?

Hi This is a exercise question from Unix network programming vol2. Why the SIGPIPE signal is generated only for writers when readers disappear. why not it is generated for readers when writer disappears. I guess, if the writer didn't get any response like the reader gets EOF, it will... (4 Replies)
Discussion started by: kumaran_5555
4 Replies

5. UNIX for Dummies Questions & Answers

fifo or named pipe working?

Can someone explain to me the working of fifo() system call using simple C programs so that I can implement them in the UNIX environement? (1 Reply)
Discussion started by: lvkchaitanya
1 Replies

6. Shell Programming and Scripting

Reading from blocking fifo pipe in shell script

Hi!! I have a problem reading from a fifo pipe in shell script. The idea is simple, I have a C program with two pipe files: An input pipe I use to send commands in shell script to the C program (echo "command" > input.pipe) An output pipe that I read the result of the command also in... (4 Replies)
Discussion started by: victorin
4 Replies

7. UNIX for Dummies Questions & Answers

Named PIPE

Gurus, I've a File Transaction Server, which communicates with other servers and performs some processing.It uses many Named PIPE's. By mistake i copied a named PIPE into a text file. I heard that PIPE files shouldn't be copied.Isn't it? Since it's a production box, i'm afraid on... (2 Replies)
Discussion started by: Tamil
2 Replies

8. Shell Programming and Scripting

FIFO named pipes

Hi...Can anyone please guide me on FIFO Pipes in UNIX.I have lerant things like creating fifo pipes,using them for reads and writes etc.I want to know what is the maximum amount of memory that such a pipe may have? Also can anyone guide me on where to get info on this topic from? (1 Reply)
Discussion started by: tej.buch
1 Replies

9. UNIX for Advanced & Expert Users

PIPE and FIFO buffer size

Hello! How I can increase (or decrease) the predefined pipe buffer size? Thanks! (1 Reply)
Discussion started by: Jus
1 Replies

10. Programming

Pipe & fifo....

Could someone Help me with this code please? #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <fcntl.h> #define SIZE_B 256 /*buffer's size */ #define NUM_ARG 20 /* max number of args for any command */ int... (4 Replies)
Discussion started by: M3xican
4 Replies
Login or Register to Ask a Question