Non tenevi in considerazione l'assenza del terminatore di stringa.
la getchar() in questo caso non serve a nulla
codice:
int main()
{
    char *s = malloc(sizeof(char)*MAX_SIZE);
    int r=0;
    do
    {
        r = read( STDIN_FILENO, s, MAX_SIZE);
        if(r==-1) 
            printf("errore");
        else
            write( STDERR_FILENO, s, r);
    }
    while( strncmp( s, "fine\n", r) != 0 );
    free(s);
    return 0;
}