FIFO named/Named Pipes
One limitation of (anonymous) pipeline applications is that they can only communicate between processes that have a common ancestor (affinity).
If we want to exchange data between unrelated processes , you can do this with a FIFO file, which is often referred to as a named pipe; a named pipe is a special type of file.
Create a named pipe
1) Named pipes can be created from the command line:
$ Mkfifo <filename>
2) Named Pipes are created in the program:
#include <sys/types.h> #include <sys/stat.h> int mkfifo (const char *pathname, mode_t mode);
Example int main () { if (Mkfifo ("P2", 0644) = =-1) err_exit ("Mkfifo error");}
The difference between FIFO and pipe:
1) anonymous pipes are created and opened by the pipe function.
Named pipes are created by the Mkfifo function and opened with open
2) The only difference between FIFO (named pipe) and pipe (anonymous pipe) is that they are created and opened in a different way, but once these work is completed, they have the same semantics (theonly difference between pipes and FIFOs is the manner in which they is created and opened.
Once These tasks have been accomplished, I/O on pipes and FIFOs had exactly the same semantics. ).
Open rules for Named pipes
1) Read Open FIFO
O_nonblock Disable (blocked): block until a corresponding process has opened the FIFO for write
O_nonblock Enable(non-blocking): Return to success immediately
Example 1: Blocking, read-only open int main () { int fd = open ("FIFO", o_rdonly); if (fd = =-1) err_exit ("FIFO open Error"); cout << "FIFO o_rdonly Open Success" << Endl;}
Example 2: Read-only, non-blocking open int main () { int fd = open ("FIFO", o_rdonly| O_nonblock); if (fd = =-1) err_exit ("FIFO open Error"); cout << "FIFO o_rdonly Open Success" << Endl;}
2) write Open FIFO
O_nonblock Disable (blocking): blocks until the corresponding process has opened the FIFO for reading
O_nonblock Enable (non-blocking): return failure immediately, error code Enxio
Example 1: Blocking, write-only open int main () { int fd = open ("FIFO", o_wronly); if (fd = =-1) err_exit ("FIFO open Error"); cout << "FIFO o_wronly Open Success" << Endl;}
Example 2: Non-blocking, write-only open int main () { int fd = open ("FIFO", o_wronly| O_nonblock); if (fd = =-1) err_exit ("FIFO open Error"); cout << "FIFO o_wronly Open Success" << Endl;}
Read and write rules for named pipes
With Anonymous pipelines
2:readfifoint Main (int argc, char *argv[]) { if (argc < 2) Err_quit ("Usage:./writefifo <write-file-name > "); int outfd = open (argv[1], o_wronly| O_creat| O_trunc, 0644); Create and punch the file int infd = open ("Myfifo", o_rdonly); Open FIFO if (infd = =-1 | | outfd = = 1) err_exit ("Open File/fifo Error"); Char Buf[bufsiz]; int readbytes; while ((readbytes = Read (INFD, buf, sizeof (BUF))) > 0) { write (outfd, buf, readbytes); } Close (OUTFD); Unlink ("Myfifo"); Delete FIFO}
Linux IPC Practice (3)--named FIFO