c / llamada interrumpida del sistema / fork vs. thread

Descubrí un problema con la implementación de subprocesos, eso es extraño para mí. Tal vez algunos de ustedes me lo puedan explicar, sería genial.

Estoy trabajando en algo como un proxy, un programa (que se ejecuta en diferentes máquinas) que recibe paquetes a través de eth0 y lo envía a través de ath0 (inalámbrico) a otra máquina que está haciendo exactamente lo mismo. En realidad, no estoy del todo seguro de qué está causando mi problema, eso es porque soy nuevo en todo, linux y programación en C.

Comienzo dos hilos,

one está escuchando (socket) en eth0 para los paquetes entrantes y lo envía a través de ath0 (también socket) y el otro hilo está escuchando en ath0 y envía a través de eth0.

Si uso hilos, me sale un error así:

sh-2.05b# ./socketex 
Failed to send network header packet.
: Interrupted system call

Si uso fork (), el programa funciona como se esperaba. ¿Alguien puede explicarme ese comportamiento?

Solo para mostrar la implementación del remitente aquí viene su fragmento de código:

while(keep_going) {
    memset(&buffer[0], '\0', sizeof(buffer));

    recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
    if(recvlen < 0) {
        perror("something went wrong / incoming\n");
        exit(-1);
    }

    strcpy(msg, buffer);
    buflen = strlen(msg);

    sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh,  buflen, msg, &selpv2, &depv);

    if(sentlen == E_ERR) {
        perror("Failed to send network header packet.\n");
        exit(-1);
    }
}

ACTUALIZA: mi archivo principal, iniciando hilos o procesos (fork)

int main(void) {

port_config pConfig;

memset(&pConfig, 0, sizeof(pConfig));
pConfig.inPort = 2002;
pConfig.outPort = 2003;

pid_t retval = fork();

if(retval == 0) {
    // child process
    pc2wsuThread((void *) &pConfig);
} else if (retval < 0) {
    perror("fork not successful\n");
} else {
    // parent process
    wsu2pcThread((void *) &pConfig);
}

/*
wint8 rc1, rc2 = 0;

pthread_t pc2wsu;
pthread_t wsu2pc;

rc1 = pthread_create(&pc2wsu, NULL, pc2wsuThread, (void *) &pConfig);
rc2 = pthread_create(&wsu2pc, NULL, wsu2pcThread, (void *) &pConfig);

if(rc1) {
    printf("error: pthread_create() is %d\n", rc1);
    return(-1);
}

if(rc2) {
    printf("error: pthread_create() is %d\n", rc2);
    return(-1);
}

pthread_join(pc2wsu, NULL);
pthread_join(wsu2pc, NULL);
*/
return 0;
}

¿Ayuda?

actualiza 30/05/2011 @

-sh-2.05b# ./wsuproxy 192.168.1.100
mgmtsrvc
mgmtsrvc
Failed to send network header packet.
: Interrupted system call
13.254158,75.165482,DATAAAAAAmgmtsrvc
mgmtsrvc
mgmtsrvc

Todavía reciba la llamada interrumpida del sistema, como puede ver arriba. Bloqueé todas las señales de la siguiente manera:

sigset_t signal_mask;
sigfillset(&signal_mask);
sigprocmask(SIG_BLOCK, &signal_mask, NULL);

Los dos subprocesos funcionan en las mismas interfaces, pero en puertos diferentes. El problema parece aparecer todavía en el mismo lugar (búscalo en el primer fragmento de código). No puedo ir más allá y no tengo suficiente conocimiento de cómo resolver ese problema. Quizás algunos de ustedes puedan ayudarme aquí nuevamente.

Gracias por adelantado

Respuestas a la pregunta(2)

Su respuesta a la pregunta