> file2 in cat file1 > file2 não são argumentos enviados para cat . Eles são interpretados por o shell (bash, neste caso), para redirecionar a saída de cat para file2 . Você não pode fazer isso diretamente via execlp . O que você está fazendo é o equivalente a cat file1 \> file2 em um terminal, onde o > , sendo escapado, não é interpretado pelo shell.
Você precisa usar system() , que usa um shell para executar uma string de comando ou redirecionar a saída usando C funciona como open() e dup2() . Como fazer isso é uma questão de programação, que pertence ao Stack Overflow.