The Pipex project is a detailed exploration and programming of a UNIX pipe. The project is coded in C and adheres to the 42 School coding norm. This project served as an excellent opportunity to gain a deeper understanding of system calls and inter-process communication via pipes in a UNIX-like system.
You can launch the test script by running the following command:
chmod +x test.sh && ./test.sh
You can use the following arguments to run the test script:
./test.sh clean # Cleans the project
./test.sh bonus # Runs the bonus project testsThe Pipex project mimics the behavior of the following simple shell command:
< file1 cmd1 | cmd2 > file2
This command takes two commands - cmd1 and cmd2 - and two files - file1 and file2. It runs cmd1 with file1 as input and cmd2 with the output of cmd1 as input. The final output of cmd2 is then written into file2.
The Pipex program is executed in the following way:
./pipex file1 cmd1 cmd2 file2
Through this project, I have gained a deeper understanding of the following:
- The use of pipes for inter-process communication.
- The use of system calls such as
fork(),execve(),pipe(),dup(),dup2(), andwaitpid(). - Handling and redirection of standard input, output and error.
- The use of file descriptors.
- Error handling and memory management in C, ensuring no memory leaks.
- Reading and understanding man pages.
- Working with Makefiles and libraries in C.
- Practical experience with Makefiles and libraries in C.
The Pipex project also ventured into additional complexities such as:
- Managing multiple pipes, which extends the functionality to this format:
./pipex file1 cmd1 cmd2 cmd3 ... cmdn file2
This is identical to the shell command:
< file1 cmd1 | cmd2 | cmd3 ... | cmdn > file2
If you encounter the following error when running make:
make: *** No rule to make target 'libft.a', needed by 'pipex'. Stop.
You can fix it by running the following command:
git submodule update --init --recursive
If the git submodules didn't clone properly, you can run the following commands to clone the submodules:
git submodule update --init --force --remote