Mi sembra sbagliata la diagnosi. execvp() funziona. Il link iniziale mostra questo codice (corretto!)
execvp(argv[0], argv); /* only gets here if execvp fails */ return -1; Perche` exec non ritorna. E se tornasse la funzione tornerebbe -1, non 1. "rc" = return command. Qui e` il processo figlio che fa exit(1). Consiglio di guardarlo con "strace -f" per vedere cosa fa il processo figlio e perche` termina male. Ovviamente non si vedranno le sue if che sbagliano e generano l'errore, ma spesso la sequenza di chiamate di sistema indica chiaramente cosa e` andato storto. Certo, se il codice fa solo: if (!getenv("VARIABILE_STRANA")) exit(1); mica lo vediamo da strace, ma e` improbabile che non si noti niente di sbagliato nei suoi accessi.