Open In App

Sort Numbers from File Using Unix Pipes in C

Last Updated : 30 Jan, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

In this article, we will write a straightforward C program that sorts numerical data from a file using pipes and forks.The sorting process is carried out using the sort command and the execlp function of UNIX.

Working of the Program

  1. We need to include the following header files to use the relevant functions:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #include <unistd.h>
    5. #include <sys/wait.h>
    6. #include <fcntl.h>
  2. The name of the file to be read will be taken as the command line argument.
  3. After that, we create a pipe and store the file descriptor for it in the fd[] array.
  4. Then we create another process using fork() call.
  5. In the child process, sort() system call is called for the file passed as a command line argument, and the data returned by the sort() call is sent to the pipe.
  6. In the parent process, the data is received and read using the buffer and is printed on the console.

C Program to Sort Numbers from File using Unix Pipes

C




// C Program to illustrate how to sort numbers from file using unix pipes
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
 
#define buffer 1024
 
int main(int argc, char *argv[]) {
    int id, fd[2];
    char my_copy[buffer];
 
    // Check if the user provides the correct number of arguments
    if (argc != 2) {
        printf("Usage: %s <input_file>\n", argv[0]);
        exit(1);
    }
 
    // Create a pipe
    if (pipe(fd) == -1) {
        perror("Pipe creation failed");
        exit(2);
    }
 
    // Fork a child process
    id = fork();
 
    // Check for fork errors
    if (id == -1) {
        printf("An error occurred with fork\n");
        exit(3);
    }
 
    // Child process
    if (id == 0) {
        //Close read of the pipe
        close(fd[0]);
 
        //redirect stdout to pipe
        dup2(fd[1], STDOUT_FILENO);
 
        //execute 'sort' command
        execlp("sort", "sort", "-n", argv[1], NULL);
        perror("Error calling execl");
        exit(4);
    } else {
        // Parent process
 
        //Close write of the pipe
        close(fd[1]);
 
        //wait for the child process to finish
        wait(NULL);
 
        // Open the read the pipe as a file
        FILE *pipe_fd = fdopen(fd[0], "r");
 
        // Checking if the pipe is null
        if (pipe_fd == NULL) {
            perror("fdopen");
            exit(5);
        }
         
        // Reading the data from the pipe and print them
        while ((fgets(my_copy, sizeof(my_copy), pipe_fd)) != NULL) {
            //Checks when there is a line break and prints the data
            if (strchr(my_copy, '\n') != NULL) {
                printf("Data received through pipe:%s", my_copy);
            }
        }
 
        // Close the FILE
        fclose(pipe_fd);
    }
 
    return 0;
}


Output

While running program, provide the file name you want to read,

./your_program_name [input file]

Now assume that your file contains the the following data

file.txt

2
84
321
684
321
84

Then the output will be

Data received through pipe:2
Data received through pipe:84
Data received through pipe:84
Data received through pipe:321
Data received through pipe:321
Data received through pipe:684


Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads