Implementing Inter-Process Communication Using Named Pipes in Unix Systems

Nov 22, 2025 · Programming · 11 views · 7.8

Keywords: Inter-Process Communication | Named Pipes | Unix System Programming

Abstract: This paper comprehensively examines the implementation of inter-process communication using named pipes (FIFO) in Unix/Linux systems. Through detailed analysis of C programming examples, it explains the creation, read/write operations, and resource management mechanisms of named pipes, while comparing them with anonymous pipes. The article also introduces bash coprocess applications for bidirectional communication in shell scripts, providing developers with complete IPC solutions.

Fundamental Concepts of Inter-Process Communication

In Unix/Linux operating systems, Inter-Process Communication (IPC) serves as a critical technology for enabling multiple processes to collaborate effectively. Pipes, as a classical IPC mechanism, can be categorized into anonymous pipes and named pipes. Anonymous pipes are typically used for communication between related processes, while named pipes (FIFO) overcome this limitation by allowing any two processes to exchange data.

Implementation Principles of Named Pipes

Named pipes exist as special files in the file system, enabling unrelated processes to access the same pipe through file paths. Unlike regular files, named pipes don't store actual data but serve as channels for inter-process data transmission. Their core characteristics include:

C Language Implementation Examples

The following demonstrates a complete named pipe communication example, including both writer and reader implementations:

/* Writer program - writer.c */
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    int file_descriptor;
    const char* fifo_path = "/tmp/communication_fifo";
    
    /* Create named pipe with read-write permissions */
    mkfifo(fifo_path, 0666);
    
    /* Open pipe in write-only mode and send data */
    file_descriptor = open(fifo_path, O_WRONLY);
    write(file_descriptor, "Hello from writer", 17);
    close(file_descriptor);
    
    /* Clean up pipe file */
    unlink(fifo_path);
    return 0;
}
/* Reader program - reader.c */
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define BUFFER_SIZE 256

int main() {
    int file_descriptor;
    const char* fifo_path = "/tmp/communication_fifo";
    char buffer[BUFFER_SIZE];
    
    /* Open pipe in read-only mode and receive data */
    file_descriptor = open(fifo_path, O_RDONLY);
    read(file_descriptor, buffer, BUFFER_SIZE);
    printf("Received message: %s\n", buffer);
    close(file_descriptor);
    
    return 0;
}

Application Scenarios for Anonymous Pipes

Complementing named pipes, anonymous pipes are created via the pipe() system call and primarily serve communication between parent-child or sibling processes. The following example demonstrates data transmission using anonymous pipes after fork creation:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    int pipe_fd[2];
    pid_t child_pid;
    char message[] = "Inter-process communication";
    char receive_buffer[100];
    
    /* Create pipe */
    pipe(pipe_fd);
    
    if ((child_pid = fork()) == -1) {
        perror("fork failed");
        exit(1);
    }
    
    if (child_pid == 0) {
        /* Child process: close read end, write to pipe */
        close(pipe_fd[0]);
        write(pipe_fd[1], message, strlen(message) + 1);
        exit(0);
    } else {
        /* Parent process: close write end, read from pipe */
        close(pipe_fd[1]);
        read(pipe_fd[0], receive_buffer, sizeof(receive_buffer));
        printf("Parent received: %s\n", receive_buffer);
    }
    
    return 0;
}

Process Communication in Shell Environment

In bash shell, the coprocess functionality provides another approach to inter-process communication. Using the coproc command, developers can create coprocesses and establish bidirectional communication channels:

#!/bin/bash
# Create coprocess to execute commands
coproc command_process {
    ./process_one | ./process_two
}

# Use unbuffered cat for data forwarding
stdbuf -i0 -o0 cat <&${command_process[0]} >&${command_process[1]}

A more elegant implementation involves decomposing pipeline steps to avoid external tools:

#!/bin/bash
# Launch first part of pipeline
coproc {
    ./prog_a | ./prog_b
}

# Launch second part and establish connection
./prog_c <&${COPROC[0]} >&${COPROC[1]}

Technical Considerations and Best Practices

In practical development, several key aspects require attention:

Conclusion

Named pipes, as essential inter-process communication mechanisms in Unix/Linux systems, provide flexible and reliable data transmission solutions. By combining C language system programming with shell scripting techniques, developers can build efficient distributed application systems. Understanding the underlying principles and implementation details of pipes is crucial for designing robust software architectures.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.