Capturando o código de status de saída do processo filho

Eu tenho uma função que bifurca um processo, duplica os descritores de arquivo para buffers de entrada e saída e, em seguida, executaexecl em um comando transmitido por meio de uma string chamadacmd:

static pid_t
c2b_popen4(const char* cmd, int pin[2], int pout[2], int perr[2], int flags)
{
    pid_t ret = fork();

    if (ret < 0) {
        fprintf(stderr, "fork() failed!\n");
        return ret;
    }
    else if (ret == 0) {
        /*                                                                                                                                                                                                                                                                                                                  
           Assign file descriptors to child pipes (not shown)...                                                                                                                                                                                                                                                                                               
        */
        execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
        fprintf(stderr, "execl() failed!\n");
        exit(EXIT_FAILURE);
    }
    else {
        /*                                                                                                                                                                                                                                                                                                                  
           Close parent read and write pipes (not shown)...                                                                                                                                                                                                                                                                                              
        */
        return ret;
    }
    return ret;
}

Cada um doscmd instâncias processam meus dados corretamente, desde que minhas entradas de teste estejam corretas.

Quando dados incorretos são passados para um processo filho, meu programa pai é executado até a conclusão e sai com um código de status sem erro 0.

Se eu deliberadamente colocar uma entrada ruim - tentar propositadamente obter um doscmd instâncias falhem da maneira esperada - eu gostaria de saber como capturar o status de saída dessacmd para que eu possa emitir o código de status de erro correto do programa pai, antes da finalização.

Como isso geralmente é feito?

questionAnswers(1)

yourAnswerToTheQuestion