---
description: In this section, we shall see what are FIFOs and how they work
---

# Named pipe FIFO

[Link to FIFO manual](https://man7.org/linux/man-pages/man7/fifo.7.html)

[Link to open function manual](https://man7.org/linux/man-pages/man2/open.2.html)

A FIFO special file (a named pipe with no extension) is similar to a pipe, except that it is accessed as part of the filesystem. It can be opened by multiple processes for reading or writing. When processes are exchanging data via the FIFO, the kernel passes all data internally without writing it to the filesystem.

**Note**: Opening the read or write end of a FIFO blocks until the other end is also opened (by another process or thread).

There are 2 ways of making a FIFO file:

* Using the command **mkfifo** in the terminal itself

```
mkfifo filename
```

* Creating a FIFO in the program itself

Example:

```c
#include <stdio.h>
#include <unistd.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>  // for open() function

int main(){
    // 0777 are the permission bits in octal which allows any user/process to read/write from/to the FIFO
    if(mkfifo("myfifo", 0777) == -1){
        if(errno == EEXIST)
            printf("FIFO already exists\n");
        else
            printf("There was some unexpected error\n");
    }
    printf("Opening FIFO...\n");
    int fd = open("myfifo", O_WRONLY);

    printf("FIFO opened\n");
    char str[15] = "Saptarshi Dey\n";

    if(write(fd, str, sizeof(str)) == -1)
        return errno;
    
    printf("Data written to FIFO\n");
    close(fd);  // close the file descriptor
    printf("Closed\n");

    return 0;
}
```

## Output

```
FIFO already exists
Opening FIFO...
```

The process stops there until we have another process reading from the FIFO

So we run this command in the same directory as the FIFO

```
cat myfifo  // command
Saptarshi Dey  // output
```

## Output after reading from FIFO

```
FIFO already exists
Opening FIFO...
FIFO opened
Data written to FIFO
Closed
```
