Um programa em C que replica o comportamento de pipes do shell Unix/Linux, permitindo redirecionar a entrada e saída de comandos através de pipes.
- Sobre o Projeto
- Compilação
- Como Usar
- Estrutura do Projeto
- Funcionamento
- Exemplos
- Tratamento de Erros
- Requisitos
O Pipex é um projeto da 42 School que implementa um programa capaz de executar dois comandos sequencialmente, conectados por um pipe, redirecionando a entrada do primeiro arquivo e a saída para um segundo arquivo.
O programa simula o seguinte comando shell:
< infile cmd1 | cmd2 > outfileEquivalente a:
./pipex infile cmd1 cmd2 outfilemakeEste comando irá:
- Compilar a biblioteca
libft - Compilar os arquivos fonte do pipex
- Gerar o executável
pipex
make clean # Remove arquivos objeto
make fclean # Remove arquivos objeto e executável
make re # Recompila tudo do zero./pipex <arquivo_entrada> <comando1> <comando2> <arquivo_saida>- arquivo_entrada: Arquivo que será usado como entrada para o primeiro comando
- comando1: Primeiro comando a ser executado
- comando2: Segundo comando a ser executado (recebe a saída do primeiro)
- arquivo_saida: Arquivo onde será gravada a saída final
- Os comandos devem estar entre aspas se contiverem argumentos
- O programa procura os executáveis nas pastas definidas na variável PATH
- O arquivo de saída é criado com permissões 0644 (rw-r--r--)
pipex/
├── includes/
│ └── pipex.h # Header principal do projeto
├── srcs/
│ ├── pipex.c # Função main e lógica principal
│ └── utils.c # Funções auxiliares
├── libft/ # Biblioteca de funções customizadas
│ ├── includes/
│ │ └── libft.h
│ └── srcs/
│ ├── ctypes/ # Funções de caracteres
│ ├── gnl/ # Get Next Line
│ ├── lists/ # Manipulação de listas
│ ├── memory/ # Gerenciamento de memória
│ ├── printf/ # Printf customizado
│ ├── stdio/ # Funções de I/O
│ ├── stdlib/ # Funções padrão
│ └── string/ # Manipulação de strings
├── makefile
└── LICENSE
typedef struct s_pipex
{
char **cmd1_args; // Argumentos do comando 1
char **cmd2_args; // Argumentos do comando 2
char *infile; // Nome do arquivo de entrada
char *outfile; // Nome do arquivo de saída
} t_pipex;- Validação: Verifica se foram passados exatamente 4 argumentos
- Inicialização: Parse dos comandos e criação da estrutura de dados
- Criação do Pipe: Estabelece a comunicação entre processos
- Fork 1: Cria o primeiro processo filho
- Abre o arquivo de entrada
- Redireciona STDIN para o arquivo
- Redireciona STDOUT para o pipe
- Executa o primeiro comando
- Fork 2: Cria o segundo processo filho
- Redireciona STDIN para o pipe
- Abre/cria o arquivo de saída
- Redireciona STDOUT para o arquivo
- Executa o segundo comando
- Processo Pai: Aguarda o término dos processos filhos
Procura o caminho completo de um comando na variável PATH do sistema.
char *get_cmd_path(char *cmd, char **envp);Executa um comando com seus argumentos usando execve.
void execute_command(char **cmds_args, char **envp);Exibe mensagem de erro, libera memória e encerra o programa.
void error_exit(char *msg, t_pipex *data);Simula: < input.txt cat | wc -l > output.txt
./pipex input.txt "cat" "wc -l" output.txtSimula: < file.txt grep "pattern" | wc -w > result.txt
./pipex file.txt "grep pattern" "wc -w" result.txtSimula: < /dev/null ls -la | grep ".c" > files.txt
./pipex /dev/null "ls -la" "grep .c" files.txtSimula: < data.txt sort | uniq > unique.txt
./pipex data.txt "sort" "uniq" unique.txtO programa trata os seguintes erros:
# Número incorreto de argumentos
./pipex file1 cmd1
# Output: parse error near `\n'# Arquivo não existe ou sem permissão de leitura
./pipex arquivo_inexistente.txt "cat" "wc -l" output.txt
# Output: pipex: infile: No such file or directory# Comando não encontrado no PATH
./pipex input.txt "comando_invalido" "wc -l" output.txt
# Output: pipex: command not found: comando_invalido# Falha ao criar pipe ou processo
# Output: pipex: pipe: [mensagem do sistema]
# ou
# Output: pipex: fork: [mensagem do sistema]- Linux ou macOS (Unix-like)
- GCC ou Clang com suporte a C99
- Bibliotecas padrão do C (libc)
-Wall -Wextra -Werror -g3
open(): Abertura de arquivosclose(): Fechamento de file descriptorsread(): Leitura de dadoswrite(): Escrita de dadosmalloc()/free(): Alocação/liberação de memóriafork(): Criação de processospipe(): Criação de pipesdup2(): Duplicação de file descriptorsexecve(): Execução de comandoswaitpid(): Espera por processos filhosaccess(): Verificação de permissõesperror(): Exibição de erros
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Claudio Matheus - clados-s
Projeto desenvolvido como parte do currículo da 42 School