Red de conocimiento informático - Aprendizaje de programación - Cómo resolver el problema del tiempo de espera de bloqueo de la cámara de Linux

Cómo resolver el problema del tiempo de espera de bloqueo de la cámara de Linux

Hoy, un colega me preguntó, ¿cómo controla el código C el tiempo de bloqueo de la conexión en Linux? El trasfondo de la aplicación es que un programa C en Linux tiene dos IP de destino que deben conectarse. Si se utiliza el bloqueo, el programa bloqueará la función de conexión cuando una de las IP no pueda conectarse.

Pensé que se podría solucionar modificando algunos parámetros con setsockopt, pero Baidu pasó mucho tiempo sin resultados. En cambio, encontré muchas soluciones en línea como esta: configure el modo de conexión en modo sin bloqueo para que el programa regrese inmediatamente una vez ejecutado, pero el problema está conectado o no. Debe esperar un momento y luego usar la función para determinar si la conexión es normal. Lo intenté. Debido a diferencias en el sistema, este método no parece funcionar en mi entorno Linux. El objetivo principal es determinar si la función conectada es incorrecta y devolver un valor independientemente de si está conectada o no.

Los métodos online no parecen fiables. Finalmente, encontramos la solución en un fragmento de código escrito por nuestros predecesores y lo compartimos aquí:

sigset(SIGALRM, u_alarm_handler);

Alarm (2);

code = connect(socket_fd, (struct sockaddr *)& socket_st, sizeof(struct sockaddr _ in));

Alarma (0);

sigrelse(siga LRM); );

Primero defina una función de procesamiento de señal de interrupción u_alarm_handler para el procesamiento de alarma después del tiempo de espera y luego defina un temporizador de 2 segundos para ejecutar la conexión. Cuando la conexión del sistema sea exitosa, el sistema funcionará normalmente. Si la conexión no se bloquea con éxito aquí, el sistema generará una señal para activar la ejecución de la función u_alarm_handler después de los 2 segundos especificados. Después de ejecutar u_alarm_handler, el programa continuará la ejecución desde la siguiente línea de conexión.

Entre ellos, la función de procesamiento se puede definir de la siguiente manera, o se puede agregar más manejo de errores.

void u_alarm_handler()

{

}

En comparación con el enfoque en línea, este método tiene una cantidad menor de código y es más refinado. Parece que el código antiguo tiene mucho que aprender.